Best way to save data on a strongly-typed view when not all fields are loaded
Let's say I have an edit view that is strongly-typed to a table called "MyData". The view has multiple tabs, each with several different fields from the table. For performan开发者_如何学运维ce, the data is only loaded when the tab is viewed, so if you only edit a field on tab 1 and submit the form, the data for tab 2 will not be loaded.
The problem I'm running into is on the submit. I'm doing the typical routine of finding the existing record in the database and updating the passed values:
<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult
Using dc = New MyDataContext
Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
orig.name = data.name
orig.desc = data.desc
...
SubmitChanges()
End Using
Return View(orig)
End Function
However, this method doesn't know which tabs were loaded, so if the tab with "desc" on it is not loaded, this method thinks the user blanked out the "desc" field, and sends NULL to the database.
How can I construct this so that only loaded fields are sent to the database, and unloaded fields are ignored?
Is there any reason you're not using UpdateModel(orig)
?
If you were using model binding, rather than manually going through the form contents and assigning the values, this would be taken care of for you. The default model binding behaviour is to ignore properties that have no corresponding form values.
You may want to take a look at this post, and the linked article in there, to learn more about model binding.
I would recommend having a separate action method for each tab that just updates the fields on that tab. The form on each tab would then just submit to the appropriate action.
Maybe a ViewModel pattern can help you here, where you part your original model like the tabs views something like:
public class Tab1
{
public string pproperty1 { get; set; }
public string pproperty2 { get; set; }
}
public class Tab2
{
public string pproperty3 { get; set; }
public string pproperty4 { get; set; }
}
public class Tab3
{
public string pproperty5 { get; set; }
public string pproperty6 { get; set; }
}
public class ViewModels
{
public Tab1 TAB1 { get; set; }
public Tab2 TAB2 { get; set; }
public Tab3 TAB3 { get; set; }
}
So When you Bind the Posted values if the Tab2 == null
then you know that this properties were not loaded neither changed by the user.
PD : Sorry for the c#, it been a time seen I vb coded.
精彩评论