代码之家  ›  专栏  ›  技术社区  ›  Çağdaş Tekin

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

  •  13
  • Çağdaş Tekin  · 技术社区  · 17 年前

    我一直在玩ASP.NETMVC,遇到了一些我想不出来的事情。

    假设我有这样一个对象:

    public class TestObject
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    

    <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() 方法始终使用默认值生成文本框,即使在回发之后也是如此,在回发过程中,对象的值具有不同的属性。当然,我想不出一个真实世界的例子,为什么我想做这样的事情,但我仍然不明白为什么我总是在文本框中填充模型的值,这些值是用 AcceptVerbs(HttpVerbs.Get)

    字体我试过了 Html.TextBox("Name", Model.Name) 但结果仍然是一样的。我验证了创建操作 AcceptVerbs(HttpVerbs.Post) 通过ViewData将值传递给视图,实际运行。 <%=Model.Name %> 但同样,文本框上没有。

    我是否有明显的遗漏,或者这种行为背后有什么原因?

    3 回复  |  直到 17 年前
        1
  •  14
  •   dpen2000    17 年前

        2
  •  11
  •   herostwist    13 年前

    我知道这个问题很久以前就得到了回答,但这是一个对我来说更具针对性的解决方案。

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

    希望这能帮助其他人。

        3
  •  3
  •   Jason Sturges    14 年前

    试试这个:-(希望对你有用)

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