【问题标题】:ASP.NET MVC Bind Exclude Not Working on Nested Object in View Model?ASP.NET MVC 绑定排除在视图模型中的嵌套对象上不起作用?
【发布时间】:2013-03-09 08:34:35
【问题描述】:

我遇到这样的问题已经有一段时间了,但一劳永逸地想知道发生了什么:)

我有一个简单的 ASP.NET MVC 视图,它绑定到视图模型类 MemberViewModel

MemberViewModel 包含一个 Linq To Sql 实体对象,我的表单主要绑定到名为 Member 的实体对象,但是我确实有大约三个其他表单字段绑定到名为 Member.User 的子类。

Member 包含有关用户的个人信息,Member.User 包含用户名 + 密码信息,两者都存储在数据库中的单独表中。

现在正如我所说,视图的模型对象使用了一个名为MemberViewModel的自定义视图模型类,其内容如下:

[Bind(Exclude = "EncryptedPassword")]
public class MemberViewModel : ViewModel
{
    public Member Member { get; set; }

    public string Password { get; set; }
    [DisplayName("Confirm Password")]
    public string ConfirmPassword { get; set; }

    public MemberViewModel() { }
    public MemberViewModel(Member member, SelectList countryList)
    {
        Member = member;
        CountryList = countryList;
    }
}

您可以看到Member 只有一个引用。 Member 是一个 Linq to Sql 对象,其中包含对User 的引用。 Password + ConfirmPassword 并且仅形成字段,并且在 Linq To Sql 中没有等效对应项。

现在我的问题是,每当我提交表单时,我的 ModelState.IsValid 属性总是返回 false,说明模型错误为 The EncryptedPassword field is invalid

现在无论我是将[Bind(Exclude = "Member.User.EncryptedPassword")] 添加到我的MemberViewModel 作为类属性,还是在User 本身的部分类上添加为[Bind(Exclude = "EncryptedPassword")]ModelState.IsValid 不断声明它是无效的。

  1. 如何让它发挥作用并从模型状态验证中排除子属性?
  2. 绑定排除如何真正发挥作用?对于子对象以及结合视图模型使用模型绑定的最佳做法是什么?

最诚挚的问候, 哥尼尔

【问题讨论】:

  • LINQ to SQL 实体中的 User.EncryptedPassword 是什么数据类型?
  • string(SO 填充字符。这里)

标签: c# .net asp.net-mvc-3 model-binding


【解决方案1】:

[Bind] 属性仅影响模型绑定。也就是说,ASP.NET MVC 框架是否会尝试从请求中填充属性。

您的问题与验证有关 - 完全是另一回事。 :)

【讨论】:

  • 谢谢,简直不敢相信!我意识到我有一个继承的AssociatedValidatorProvider,它自动将从 Linq 提取的字段验证添加到 Sql 模式规则。虽然很酷,但它为所有内容添加了验证,包括EncryptedPassword,显然我不想出现在表单上。在这里,我试图用Bind(Exclude) 修复它,正如你所说,它根本不会影响验证——我真傻!我已经通过使用ModelState.Remove() 绕过了这些领域。感谢您的快速回答!
【解决方案2】:

虽然不能直接回答您的问题,但我可以提供一点建议:尝试使用 DTO 在控制器和视图之间传递数据

您会发现很多第三方组件和库都做出了这种假设,因此从长远来看,它会让您的生活更轻松。

我指的是简单的 DTO,通常是扁平的对象,看起来像这样:

public class Dto
{
    public string PropertyName { get; set; }
    public string PropertyNameSubPropertyName { get; set; }
}

如需了解更多信息以及帮助在 dtos 和域对象之间进行映射的工具,请查看Automapper..

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多