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); 
}