在我的 MVC 应用程序中,我有一个与此类似的视图模型:
public class ComplexViewModel
{
public ComplexDetailsViewModel Details1 { get; set; }
public ComplexDetailsViewModel Details2 { get; set; }
}
public class ComplexDetailsViewModel
{
public int Id { get; set; }
public string DisplayValue1 { get; set; }
public string DisplayValue2 { get; set; }
// ...
}
在我看来,我最初是在做以下事情:
@Html.HiddenFor(model => model.Details1.Id)
@Html.HiddenFor(model => model.Details2.Id)
@Html.DisplayFor(model => model.Details1.DisplayValue1)
...
我会将完整模型发布到控制器:
public ActionResult Post(ComplexViewModel model)
除了 Id 值之外,我实际上不需要 ComplexViewModel 中的任何内容,因此我决定创建另一个专门用于发布数据的视图模型:
public class PostViewModel
{
public int Details1Id { get; set; }
public int Details2Id { get; set; }
}
public ActionResult Post(PostViewModel model)
问题是现在我的@HiddenFor(model => model.Details1.Id)
没有映射到我的 POST 模型,因此实际上没有发布任何内容。
有没有办法让我的 POST 模型和 GET 模型具有单独的结构,同时仍然使用HiddenFor
帮手?
仅仅因为您没有使用 POST 版本中的所有数据并不意味着您必须创建另一个模型。为什么不保持简单呢?
它应该是这样工作的:
您的帖子详细信息视图应该强类型化为特定的视图模型。然后在你的控制器中你有两个名为 Post 的操作结果,例如,一个用[HTTPGET]
属性,并且您要发布到的操作用[HTTPPOST]
属性。此外,您的 get 方法应采用诸如帖子 id 之类的参数,而您的 post 方法应采用模型作为参数。
要正确执行服务器端验证,您可以像这样装饰类属性:
public class ComplexDetailsViewModel
{
[Required]//Works for just the Id property
public int Id { get; set; }
public string DisplayValue1 { get; set; }
public string DisplayValue2 { get; set; }
// ...
}
现在在你的控制器中你可以使用这个布尔值:ModelState.IsValid
。基本上,如果他们关闭了 JavaScript 并且模型发布时没有Id
那么该模型将无效。
这种模式非常强大,可以快速实现客户端和服务器端验证。当然,客户端验证使用开箱即用的 jQuery,因此我们可以轻松扩展验证器。您甚至可以非常快速地进行 AJAX 验证。当我构建表单时,我不会在验证方面做出任何牺牲……因为不需要时间就能正确完成它。
回答你原来的问题:
视图只能强类型化到一个模型。您无法使用一个模型加载视图,然后使用另一个模型发布它(据我所知)。我认为如果你想这样做,你的问题就在于你构建模型的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)