ASP.NET MVC: изменение свойств модели при обратной передаче - PullRequest
13 голосов
/ 02 апреля 2009

Я играл с 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 в View. Кроме того, обновленное значение отображается при выводе значения с помощью <%=Model.Name %>, но опять же не в текстовом поле.

Есть ли что-то очевидное, что я упускаю, или есть причины этого поведения?

Ответы [ 3 ]

14 голосов
/ 02 апреля 2009

Если вы связываете результат запроса после объявления метода или UpdateModel или TryUpdateModel с таким объектом, как TestObject, свойство ModelState заполняется этими значениями. Помощники HTML, такие как Textbox, всегда будут привязываться к состоянию модели через явно переданный объект модели.

10 голосов
/ 26 марта 2013

Я знаю, что на этот вопрос давным-давно ответили, но это более целенаправленное решение, которое работает для меня.

[HttpPost]
public ActionResult Create(TestObject o) { 
    ModelState.Remove("Name");    
    o.Name = "ChangedNameToSomethingElse";     
    ModelState.Remove("Age");    
    o.Age = 15;
    return View(o); 
}

Надеюсь, это кому-нибудь поможет.

3 голосов
/ 18 июля 2012

Попробуйте это: - (надеюсь, это будет работать для вас)

[HttpPost]
[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(TestObject o) { 
    ModelState.Clear();    
    o.Name = "ChangedNameToSomethingElse";     
    o.Age = 15;
    return View(o); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...