我有一个简单的 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();
}
答案 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;" });