1

我正在将应用程序从 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 保留为空,则在 MVC 1 中它可以正常工作。但是在 MVC 3 中,当我调用它时,会在 TestModel 类UpdateModel(tm)的行中引发异常。return SubValue.Value - Age;

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

4

4 回答 4

0

你可以尝试几件事。您的 AgeSub 属性应该对 subvalue 属性进行空检查:

  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);
    }
于 2012-06-06T15:53:14.773 回答
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 发行说明。

于 2013-06-12T02:47:05.930 回答
0

如果您的代码在 MVC1 下工作(我无法理解它是如何工作的),那么这只是纯粹的运气。如果您尝试访问这样的可为空的 int 的值,它应该抛出异常。

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

于 2012-06-06T15:50:22.687 回答
0

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

在您的情况下,您可以这样做AgeSub以避免引发异常。

public int AgeSub
{
   get
   {
       return SubValue.HasValue ? SubValue.Value - Age : 0;
   }
}
于 2012-06-06T16:54:17.790 回答