在我的 MVC 应用程序中,我有一个类似于此的 View 模型:
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)
...
我会将完整模型发布到 Controller :
public ActionResult Post(ComplexViewModel model)
除了 Id 值外,我实际上不需要 ComplexViewModel 的任何东西,所以我决定创建另一个专门用于发布数据的 View 模型:
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。
有没有一种方法可以让我的 POST 模型和 GET 模型具有单独的结构,同时仍然使用 HiddenFor
助手?
最佳答案
仅仅因为您没有使用 POST 版本中的所有数据并不意味着您必须制作另一个模型。为什么不保持简单?
它应该是这样工作的:
您的帖子详细信息 View 应针对特定 View 模型进行强类型化。然后在你的 Controller 中你有两个名为 Post 的 Action 结果,一个用 [HTTPGET]
属性修饰,你要发布的 Action 用 [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; }
// ...
}
现在在您的 Controller 中,您可以使用这个 bool 值:ModelState.IsValid
。基本上,如果他们关闭了 JavaScript,并且发布的模型没有 Id
,那么该模型将无效。
此模式非常强大,可以快速实现客户端和服务器端验证。当然,客户端验证使用开箱即用的 jQuery,因此我们可以轻松扩展验证器。您甚至可以非常快速地进行 AJAX 验证。当我构建我的表单时,我不会在验证方面牺牲任何地方......因为它不需要时间就可以正确地完成。
回答您原来的问题:
一个 View 只能强类型化为一个模型。您不能用一个模型加载 View ,然后用另一个模型发布它(据我所知)。我认为,如果您正在尝试这样做,问题出在您构建模型的方式上。
关于c# - ASP.net MVC - 用于 POST 操作的单独 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512799/