仅将指定的属性从模型发送到视图

时间:2013-08-19 18:16:37

标签: c# asp.net-mvc-4

目标

将指定的属性从模型发送到视图。

场景

前一段时间,我的User模型如下:

public int Id { get; set; }

[Required]
public string Email { get; set; }

[Required]
public string Password { get; set; }

除了IdEmailPassword之外,用户还有更多属性,但在此之前,我没有使用它,因为此模型的唯一提议是对某人进行身份验证我的申请。

时间过去了,现在我必须在我的应用程序中添加一个新用户。为此,我将User的模型增强为:

public int Id { get; set; }

[Required]
public string Email { get; set; }

[Required]
public string Password { get; set; }

[Required]
public string Firstname { get; set; }

[Required]
public string Lastname { get; set; }

从那时起,我无法再登录了 - ModelState.IsValid返回False而不是True

猜测 问题显而易见:FirstnameLastnameRequired属性,我正在发送什么都没有。

问题

基于以上情况,我不得不问:有不一种方法可以为不同的提案使用相同的模型?或者,如果你想:有两种方法可以使用相同的模型吗?我的意思是,我需要相同的模型来创建用户验证用户我确实需要将IsValid属性的值设置为true,就像前一段时间一样。

2 个答案:

答案 0 :(得分:2)

(这不起作用)您是否尝试过使用BindAttribute:

public ActionResult Add([Bind(Include = "Id,Email,Password") ]User userModel .....

您也可以使用它来排除属性。

我坚持认为,绑定模型非常适合确保在提交的模型上只设置某些属性,但它们对ModelState没有帮助,而ModelState仍然包含使其无效的错误。 解决方案:

  1. 更简单:根据@asymptoticFault
  2. 的建议,使用单独的viewModel进行不同的操作
  3. 如果这不可行,或者像我一样你想折磨自己:),你可以为User对象设置一个自定义模型绑定器,并根据正在执行的操作类型,你只能填充某些属性而留下其他属性未设置但没有模型状态错误。
  4. 实现上面的自定义绑定器,但这次仅覆盖OnModelUpdated方法,并且在其中,根据正在执行的操作,您可以清除ModelState以查找您不想设置的字段(可以使用与Bind属性一起使用。)
  5. 方法2和3可能是一种矫枉过正,特别是方法2,但我觉得我应该在使用Bind属性引导你走错路之后做出贡献:)

答案 1 :(得分:1)

您可以创建一个仅封装要在视图中使用的属性的ViewModel。

public class UserViewModel
{
    public int Id { get; set; }

    [Required]
    public string Email { get; set; }

    [Required]
    public string Password { get; set; }
}

如果您的视图与您的商家/域对象不一一对应,ViewModel会很有帮助。对于除CRUD视图之外的所有内容通常都是这种情况。