c# - ASP.net MVC - 用于 POST 操作的单独 ViewModel

标签 c# asp.net-mvc viewmodel

在我的 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/

相关文章:

java - 奇怪的 LiveData 行为?

c# - 如何更改自定义跨度的背景颜色?

c# - Umbraco 7 使用语言/字典

asp.net-mvc - 隐藏 sessionState 提供程序值的最佳方法

c# - 为什么可以不处理 UserStore

asp.net - 如何使用成员资格提供程序或角色提供程序将用户添加到 aspnet_Users 表?

asp.net-mvc - 在 LINQ 查询和 ASP.NET MVC 方面需要帮助?

android - 带 LiveData 的 ViewModel 与不带 LiveData 的 ViewModel 有何不同?

c# - 如何从 WCF 服务流下载文件?

c# - 比较字典<字符串,列表<对象>>