Префикс 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, он не является стандартным. Например, разломытся, если в цель есть точка.