Asp.net mvc 更新模型更改MVC1与MVC3

Asp.net mvc 更新模型更改MVC1与MVC3,asp.net-mvc,asp.net-mvc-3,Asp.net Mvc,Asp.net Mvc 3,我正在将一个应用程序从ASP.NET MVC 1转换为MVC 3,但在提交表单时调用UpdateModel()时遇到了一些问题 这是我的模型课: public class TestModel { public string Name { get; set; } public string Description { get; set; } public int Age { get; set; } public int? SubValue { get; set; }

我正在将一个应用程序从ASP.NET MVC 1转换为MVC 3,但在提交表单时调用
UpdateModel()
时遇到了一些问题

这是我的模型课:

public class TestModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public int Age { get; set; }
    public int? SubValue { get; set; }
    public int AgeSub
    {
        get
        {
            return SubValue.Value - Age;
        }
    }
}
在我的控制器中:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult TestModelSave()
{
    TestModel tm = new TestModel();

    try
    {
        UpdateModel(tm);

        if (ModelState.IsValid)
        {
            return RedirectToAction("TestModelEdit");
        }
    }
    catch
    {
    }

    return View("TestModelEdit", tm);
}
如果我在提交时将子值保留为null,那么在MVC1中它可以正常工作。但是在MVC3中,当我调用
UpdateModel(tm)
时,它在
returnsubvalue.Value-Age行抛出一个异常


我可以将
SubValue.Value
更改为
SubValue.GetValueOrDefault()
,但我不想这样做。为什么会在MVC版本之间进行这种更改?

如果您的代码在MVC1下工作(我不明白它是如何工作的),那么这纯粹是运气。如果您试图访问像这样的可为null的int的值,它应该抛出一个异常


你的代码坏了,你应该修复它。不要抱怨它曾经起作用,因为如果它起作用,它就不应该起作用。

有几件事你可以试试。AgeSub属性应对子值属性进行空检查:

  public int AgeSub
    {
        get
        { 
            if(SubValue == null)
            {
                return 0;
            }

            return SubValue.Value - Age;
        }
    }
您可以按如下方式清理控制器操作并清除try-catch块:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult TestModelSave()
    {
        TestModel tm = new TestModel();

        if (ModelState.IsValid)
        {
            if(TryUpdateModel(tm))
            {
                return RedirectToAction("TestModelEdit");    
            }

        }

        return View("TestModelEdit", tm);
    }

如果要访问该对象的属性,则该对象不能为null。因此,最好的方法是检查对象是否为null,然后尝试访问该属性。 我高度怀疑同样的代码在MVC1中是否可以正常工作(如果它可以正常工作,您在MVC1中得到的值是多少)

在您的情况下,您可以为
AgeSub
执行此操作,以避免引发异常

public int AgeSub
{
   get
   {
       return SubValue.HasValue ? SubValue.Value - Age : 0;
   }
}

我知道这是一个很老的问题,不过仅供将来参考

在MVC1中, UpdateModel方法仅更新表单集合中指定的字段 ModelState.IsValid仅检查修改的字段的有效性

在MVC2RC及以上版本中, 现在,Model.IsValid将检查模型中所有属性的有效性,而不仅仅是检查修改后的字段

这意味着,在MVC1中调用ModelState.IsValid时,AgeSub属性未经验证,但在MVC 2及更高版本中调用了该属性

参考:

还要查看MVC2发行说明。

哦,对了。当子值为null时,它抛出“可为null的对象必须有一个值”。