UpdateModel将MVC1更改为MVC3

时间:2012-06-06 15:44:44

标签: 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; }
    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);
}

如果我在提交时将SubValue保留为null,则在MVC 1中它可以正常工作。但是在MVC 3中,当我调用UpdateModel(tm)时,它会在TestModel类的行return SubValue.Value - Age;上抛出异常。

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

4 个答案:

答案 0 :(得分:0)

如果您的代码在MVC1下运行(我无法理解它会如何),那么这只是纯粹的运气。如果你试图像这样访问可空int的值,它应该抛出一个异常。

您的代码已损坏,您应该修复它。不要抱怨它曾经工作,因为如果它曾经,它不应该有。

答案 1 :(得分:0)

你可以试试几件事。您的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);
    }

答案 2 :(得分:0)

如果要访问该对象的属性,则该对象不能为null。所以最好的办法是检查对象是否为null,然后尝试访问该属性。 我非常怀疑相同的代码在MVC1中没有任何异常(如果它正在工作,你在MVC1中获得的值是什么)

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

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

答案 3 :(得分:0)

我知道这是一个非常古老的问题,但仅供将来参考,

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

在MVC 2 RC及以上版本中, 现在改变了,Model.IsValid检查模型中所有属性的有效性,而不仅仅是检查修改后的字段。

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

参考: http://weblogs.asp.net/scottgu/archive/2010/02/05/asp-net-mvc-2-release-candidate-2-now-available.aspx#7335401

另请查看MVC 2发行说明。