ASP.NET MVC: изменение свойств модели при обратной передаче
Я играл с ASP.NET MVC и сталкивался с чем-то, что я не могу понять.
Предположим, у меня есть такой объект:
public class TestObject
{
public string Name { get; set; }
public int Age { get; set; }
}
И страница просмотра (Create.aspx):
<form action="/Create" method="post">
<p>
<%=Html.TextBox("Name") %>
</p>
<p>
<%=Html.TextBox("Age")%>
</p>
</form>
И на моем контроллере у меня есть следующие действия:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Create()
{
return View(new TestObject { Name = "DefaultName", Age = 10 } );
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(TestObject o)
{
o.Name = "ChangedNameToSomethingElse";
o.Age = 15;
return View(o);
}
Метод Html.TextBox()
всегда генерирует текстовые поля со значениями по умолчанию, даже после обратной передачи, когда объект передается обратно с различными свойствами по его значениям. Теперь, предоставленный, я не могу придумать пример реального мира, почему я хотел бы сделать такую вещь, но я до сих пор не понимаю, почему я всегда получаю текстовые поля, заполненные значениями модели, которые были установлены в действии Create с атрибутом AcceptVerbs(HttpVerbs.Get)
.
Примечание. Я пробовал Html.TextBox("Name", Model.Name)
, но результат все тот же. И я проверил, что действие Create с AcceptVerbs(HttpVerbs.Post)
действительно выполняется, передавая значение через ViewData в представление.
Кроме того, значение udated отображается, когда я вывожу значение с помощью <%=Model.Name %>
, но снова, а не в текстовое поле.
Есть ли что-то очевидное, что мне не хватает, или есть причины этого поведения?
Ответы
Ответ 1
Если вы привязываете результат почтового запроса через объявление метода или UpdateModel или TryUpdateModel к объекту, такому как TestObject, свойство, называемое ModelState, будет заполнено этими значениями. HTML-помощники, такие как Textbox, всегда будут связываться с modelstate по явно переданному объекту модели.
Ответ 2
Я знаю, что на это был дан ответ давным-давно, но это более целевое решение, которое работает для меня.
[HttpPost]
public ActionResult Create(TestObject o) {
ModelState.Remove("Name");
o.Name = "ChangedNameToSomethingElse";
ModelState.Remove("Age");
o.Age = 15;
return View(o);
}
Надеюсь, что это поможет кому-то там.
Ответ 3
Попробуйте следующее: - (надеюсь, что это сработает для вас)
[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(TestObject o) {
ModelState.Clear();
o.Name = "ChangedNameToSomethingElse";
o.Age = 15;
return View(o);
}