Почему мой член MVC ViewModel переопределяется моим параметром ActionResult? - PullRequest
5 голосов
/ 13 августа 2010

Это ошибка или функция?

Весь приведенный ниже код упрощен для краткости и простоты репликации и на самом деле не делает ничего полезного, кроме выделения поведения.

У меня есть класс, который включает int с именем ID:

public class FooterLink
{
    public int ID { get; set; }
}

В моем контроллере у меня есть Edit Actionresult, который принимает параметр с именем 'id':

public ActionResult Edit(int id)
{
    return View(new FooterLink() { ID = 5 }); //notice that I am explicitly setting the ID value here.
}

в моем индексеview У меня есть ссылка на действие редактирования, в котором указан параметр 'id':

<%= Html.ActionLink("Edit", "Edit", new { id = 1 })%>

На мой взгляд, у меня есть пара текстовых полей:

<%= Html.TextBox("ID", Model.ID)%>
<%= Html.TextBox("Blah", Model.ID) %>

, которые отображают следующеев HTML:

<input id="ID" name="ID" type="text" value="1">
<input id="Blah" name="Blah" type="text" value="5">

Обратите внимание, что вход с идентификатором "ID" получает свое значение не из модели, как я говорю ... а из параметра, который был предоставлен моему ActionResult,Это поведение то же самое с Html.TextBoxFor, Html.Hidden, Html.HiddenFor и т. Д.

Что дает?

EDIT: Я хотел обновить это долговремя назад, но никогда не удосужился к этому.Причина, по которой это происходит, заключается в том, что ModelState будет иметь запись «id» со значением параметра «id» в методе, а MVC ViewEngine сначала проверяет ModelState при заполнении Html-помощников вместо Model. Чтобы обойти это, вы можете просто добавить следующую строку в свой контроллер непосредственно перед возвратом:

ModelState.Remove("id");

Теперь <% = Html.TextBox ("ID",Model.ID)%> получит значение из Model, а не ModelState.Проблема решена.

1 Ответ

7 голосов
/ 13 августа 2010

Вот как работают помощники html.Сначала они проверят, есть ли параметр ID в URL запроса, и используют это значение вместо значения, указанного в качестве второго аргумента в модели.

...