1

目标

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

场景

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

public int Id { get; set; }

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

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

用户的属性比Id,Email和更多Password,但在那之前,我没有使用它,因为这个模型的独特建议是在我的应用程序上对某人进行身份验证。

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

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.

这个问题很明显:Firstname并且LastnameRequired属性,我什么也没发送。

问题

基于上述场景,我不得不问:有没有办法为不同的提案使用相同的模型?或者,如果您愿意:有一种方法可以两次使用相同的模型?我的意思是,我需要相同的模型来创建用户验证用户,我真的需要像前一段时间一样获取IsValid属性的值。true

4

2 回答 2

2

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

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

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

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

  1. 更简单的一个:按照@asymptoticFault 的建议,为不同的操作使用单独的视图模型
  2. 如果这不可行,或者像我一样你想折磨自己:),你可以为 User 对象创建一个自定义模型绑定器,并且根据正在执行的操作类型,你只能填充某些属性,而让其他属性保持未设置但没有模型状态错误。
  3. 像上面一样实现自定义绑定器,但这次仅覆盖 OnModelUpdated 方法,并且在其中,根据正在执行的操作,您可以清除不想设置的字段的 ModelState(这可以与绑定属性)。

方法 2 和 3 可能有点矫枉过正,尤其是方法 2,但我觉得在使用 Bind 属性引导你走错路之后,我应该做出一些贡献:)

于 2013-08-19T18:22:37.427 回答
1

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

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

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

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

当您的视图无法与您的业务/域对象一一对应时,ViewModel 很有帮助。除了 CRUD 视图之外的所有内容通常都是这种情况。

于 2013-08-19T18:35:16.227 回答