返回到Controller Action后,MVC ViewData Model为null

时间:2012-03-18 21:40:47

标签: asp.net-mvc razor viewmodel asp.net-mvc-4

我有一个简单的 MVC 4(Beta)应用程序,只是观察到我认为可能会以不同方式处理的内容。在这种情况下,当调用以下产品操作时,会创建模型并将其分配给 ViewData ,以便在查看中使用。这一切都运行正常,模型属性不为null,并且使用Model属性的Views视图。

[HttpGet]
public ActionResult Product()
{
    return ExecuteFormRequest(View(), true, delegate
    {
        var model = Request.ParseFromQueryString<Product>();

        if (model != null)
        {
            ViewData.Model = model;
        }

        return View();
    });
}

当产品更新并发布回Controller时,所有数据看起来都很好,但如果产品验证失败并且我返回View ActionResult(,如下所示视图遇到空引用异常,因为视图模型属性现在为空

[HttpPost]
public ActionResult Product(Product product)
{
    if (!ModelState.IsValid)
    {
        return View();
    }

    // Do other business stuff and target new or same View    

    return View();
}

这是视图中导致空引用异常的行,因为模型属性现在为空。

@if (!string.IsNullOrEmpty(Model.MyValue)) {}

我解决这个问题的方法是重置模型属性(,如下所示)。这对我来说似乎不对,我想知道我是否接近这一切都错了。欢迎任何想法?

[HttpPost]
public ActionResult Product(Product product)
{
    if (product!= null)
    {
        ViewData.Model = product;
    }

    if (!ModelState.IsValid)
    {
        return View();
    }

    // Do other business stuff and target new or same View    

    return View();
}

3 个答案:

答案 0 :(得分:3)

如果您有一个强类型的视图模型,为什么使用viewdata?试试这个:

[HttpGet]
public ActionResult Product()
{
    return ExecuteFormRequest(View(), true, delegate
    {
        var model = Request.ParseFromQueryString<Product>();

        //if (model != null)
        //{
        //    ViewData.Model = model;
        //}

        //return View();
        return View(model);
    });
}

[HttpPost]
public ActionResult Product(Product product)
{
    if (!ModelState.IsValid)
    {
        //return View();
        return View(product);
    }

    // Do other business stuff and target new or same View    

    //return View();
    return View(product);
}

您看到行为的原因是因为HTTP是无状态的。与webforms不同,MVC不会在帖子后重建所有变量。每个操作方法都以一个新的ViewData字典开始。

答案 1 :(得分:1)

您为什么使用ViewData?不要使用它。简单一点,并在返回时始终将视图模型传递给视图:

[HttpGet]
public ActionResult Product()
{
    return ExecuteFormRequest(View(), true, delegate
    {
        var model = Request.ParseFromQueryString<Product>();

        return View(model);
    });
}

[HttpPost]
public ActionResult Product(Product product)
{
    if (!ModelState.IsValid)
    {
        return View(product);
    }

    // Do other business stuff and target new or same View    

    return View(product);
}

答案 2 :(得分:1)

如果您在视图中使用Action Link来进行回发操作。表单未提交,其结果为空值模型。尝试在动作链接Click事件上提交将解决问题的表单。

以下是在Action Link事件

上提交表单的示例
@Html.ActionLink("Save1", "Method1", "HelloWorld", @Model, new { onclick = "$(this).parents('form').attr('action', $(this).attr('href'));$(this).parents('form').submit();return false;" });