Префикс UpdateModel - ASP.NET MVC
У меня возникают проблемы с TryUpdateModel()
. Мои поля формы называются с префиксом, но я использую - как мой разделитель, а не по умолчанию.
<input type="text" id="Record-Title" name="Record-Title" />
Когда я пытаюсь обновить модель, она не обновляется. Если я изменяю атрибут name на Record.Title
, он работает отлично, но это не то, что я хочу сделать.
bool success = TryUpdateModel(record, "Record");
Можно ли использовать специальный разделитель?
Ответы
Ответ 1
Еще одна вещь, которую следует отметить, заключается в том, что префикс должен помочь отражению найти правильное поле для обновления. Например, если у меня есть собственный класс для моих ViewData, например:
public class Customer
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
public class MyCustomViewData
{
public Customer Customer {get; set;}
public Address Address {get; set;}
public string Comment {get; set;}
}
и у меня есть текстовое поле на моей странице
<%= Html.TextBox("FirstName", ViewData.Model.Customer.FirstName) %>
или
<%= Html.TextBox("Customer.FirstName", ViewData.Model.Customer.FirstName) %>
вот что работает
public ActionResult Save (Formcollection form)
{
MyCustomViewData model = GetModel(); // get our model data
TryUpdateModel(model, form); // works for name="Customer.FirstName" only
TryUpdateModel(model.Customer, form) // works for name="FirstName" only
TryUpdateModel(model.Customer, "Customer", form); // works for name="Customer.FirstName" only
TryUpdateModel(model, "Customer", form) // do not work
..snip..
}
Ответ 2
Нет, если вы не реализуете свой собственный ModelBinder. Если вы посмотрите на исходный код DefaultModelBinder на www.codeplex.com/aspnet, вы увидите, что при указании префикса он строит имя на конкатенация префикса, период и имя свойства. К сожалению, метод DefaultModelBinder, который делает это, является частным статическим и, следовательно, не может быть переопределен в производном классе.
Ответ 3
Это было неправильное решение использовать период. Подчеркивание было бы лучше.
Это означает, что вы должны отдельно определять все свои идентификаторы.
т. Текстовое поле теперь имеет Html.TextBox( "test.test", новый {@id = "test" )
Ответ 4
Есть причина не использовать. как ID/Name в HTML bcs, он не является стандартным. Например, разломытся, если в цель есть точка.