ASP.NET MVC:在回发时更改模型的属性

时间:2009-04-01 22:21:50

标签: 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),但结果仍然相同。我通过ViewData将值传递给View,验证了实际运行AcceptVerbs(HttpVerbs.Post)的操作。 此外,当我使用<%=Model.Name %>输出值时,会显示更新的值,但不会在文本框中输出。

是否有一些明显的东西我缺失了,或者这种行为背后是否存在推理?

3 个答案:

答案 0 :(得分:14)

如果通过声明方法或通过UpdateModel或TryUpdateModel将post请求的结果绑定到TestObject等对象,则会使用这些值填充名为ModelState的属性。诸如Textbox之类的HTML帮助程序将始终通过显式传递的模型对象绑定到modelstate。

答案 1 :(得分:10)

我知道很久以前就已经回答了这个问题,但这对我来说更有针对性。

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

希望这可以帮助那些人。

答案 2 :(得分:3)

试试这个: - (希望它能为你效劳)

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