价值观;“一些价值”;asp.net模型绑定验证无效

价值观;“一些价值”;asp.net模型绑定验证无效,asp.net,asp.net-mvc-2,Asp.net,Asp.net Mvc 2,控制器: public ActionResult EditTest() { return View(new EditTestViewModel("Is this a test?")); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult EditTest(EditTestViewModel test) { return View(new EditTestViewM

控制器:

    public ActionResult EditTest()
    {
        return View(new EditTestViewModel("Is this a test?"));
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult EditTest(EditTestViewModel test)
    {
        return View(new EditTestViewModel("Is this a test?"));
    }
视图模型:

public class EditTestViewModel
{
    public String test { get; set; }

    public EditTestViewModel(String test)
    {
        this.test = test;
    }
}
视图:


模型试验)%>
模型试验)%>
单击“保存”时的结果(无论是否编辑数据):

值“这是测试吗?”为 无效


发生了什么事?

当您运行此代码并提交表单时,会遇到以下第一个异常:

[MissingMethodException: No parameterless constructor defined for this object.]
这是因为
EditTestViewModel
没有无参数构造函数,您不能像这样使用它

代码的第二个问题是在POST操作中创建新对象,而不是重用作为参数传递的对象

下面是修复方法:

视图模型:

public class EditTestViewModel
{
    public String test { get; set; }
}
控制器:

public ActionResult EditTest()
{
    var model = new EditTestViewModel
    {
        test = "Is this a test?"
    }
    return View(model);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditTest(EditTestViewModel test)
{
    return View(model);
}
如果出于某种原因,您希望在POST操作中编辑该值,并将其反映在视图中,则需要将其从模型状态中删除,否则HTML帮助程序将选择旧值:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditTest(EditTestViewModel test)
{
    model.test = "new value";
    ModelState.Remove("test");
    return View(model);
}

是的,关于第一点你是对的。第二点——这只是一个测试,没有意义。但错误的实际原因是控制器参数名称与类变量名称相同,这会混淆绑定器+你在开玩笑吗?经过一整天的调试,搜索网络,清理项目,解决办法就是活页夹被弄糊涂了。活页夹弄糊涂了?这是真的。所以在我脑子里燃烧这个,“宾得很困惑,宾得很困惑,宾得很困惑。。。。
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditTest(EditTestViewModel test)
{
    model.test = "new value";
    ModelState.Remove("test");
    return View(model);
}