ASP.NET MVC:更改模型属性的回传操作

14

我一直在使用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()方法总是生成带有默认值的文本框,即使在 postback 之后,对象以其值的不同属性传回。尽管我想不出为什么会有这样的实际场景,但我仍然不理解为什么我总是要使用 AcceptVerbs(HttpVerbs.Get) 属性设置的模型值填充文本框。 注意:我已经尝试过使用Html.TextBox("Name", Model.Name),但结果仍然相同。并且我通过 ViewData 向 View 传递一个值来验证了具有 AcceptVerbs(HttpVerbs.Post) 的 Create action 实际上正在运行。 另外,在使用 <%=Model.Name %> 输出值时,更新后的值会显示,但在文本框中没有显示更新后的值。
我是否遗漏了什么明显的东西,或者这种行为背后是否有什么原因?

3
你可能对我回答类似问题的回答感兴趣 - https://dev59.com/xEfSa4cB1Zd3GeqPAt_W#954524。 - Alexander Prokofyev
3个回答

14
如果您通过方法声明、UpdateModel或TryUpdateModel将post请求的结果绑定到TestObject等对象上,一个名为ModelState的属性将被填充这些值。像Textbox这样的HTML助手总是优先绑定到ModelState而不是显式传递的模型对象。

谢谢你的回答。你是否也知道重新填充ModelState的正确和建议方法,例如通过给它一个对象?或者在清空集合后,我应该手动为其提供键和值? - Çağdaş Tekin
7
我刚刚检查了一下。您可以在使用Post属性的Create操作中调用ModelState.Clear()来实现您想要的功能。 - dpen2000
是的,看起来它能工作。再次感谢您的帮助。我会将问题保持开放一段时间,以防有人知道其他也可能有用的方法。 - Çağdaş Tekin
当然,感谢您提出您的问题:今晚我也学到了更多。 - dpen2000
谢谢,这也帮了我。至于你提到的真实世界应用- 我正在编写一个界面,该界面在模型中有列表,并且一些http post命令将从列表中删除项目。在这种情况下,您需要使用模型值作为myList [1],例如在删除项目后,ModelState将不同,但是创建文本框时MVC将绑定不正确的值。 - amarsuperstar

12

我知道这个问题已经很久以前得到了解答,但这是一个更具针对性的解决方案,适用于我。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接