【问题标题】:MVC3 Form binding duplicated across two neighbouring html formsMVC3 表单绑定在两个相邻的 html 表单中重复
【发布时间】:2011-07-10 17:21:02
【问题描述】:

我有一个场景,我在注册表旁边有一个登录表单,因为登录表单是一个永久固定装置(直到进一步开发),有时作为主要内容的注册与此登录表单一致。

现在我们进入了暮光区:两种形式在不同的控制器上都有不同的动作,但它们有两个共同点,它们都有一个ValidationSummary,并且它们都有一个名为UserName的字段。如果我导致服务器端验证错误,例如当用户没有勾选“接受使用条款”时,使用

ModelState.AddModelError("", "You must accept the Terms and Conditions to become a member.");

错误显示在两个表单的验证摘要中,新用户名(即尝试注册的用户)显示在两个表单的UserName 字段中。这些表单甚至不共享一个公共视图模型type,更不用说实例了。我只能要求正确地提出这个问题是WTF吗?

【问题讨论】:

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


    【解决方案1】:

    似乎是客户端输入名称相同的问题。看看BindAttribute.PrefixTemplateInfo.HtmlFieldPrefix。通过使用它们,您可以为这些不同的操作和模型生成不同的客户端 ID 和名称,并且问题可能会得到解决。 HtmlFieldPrefix 用于为客户端生成的 id 添加前缀,Bind.Prefix 用于绑定使用HtmlFieldPrefix 生成的客户端表单值。它们都在控制器动作中设置。

    【讨论】:

    • 我接受了罗德里戈的回答,因为它已经对我有用,但我认为你的回答是我将来必须研究的。我不喜欢在命名模型属性时“人为干预”。
    • 您所需要的只是特定位置的不同客户端 ID,仅此而已。你是对的,重命名模型属性可能比在单个地方应用自定义前缀更麻烦
    【解决方案2】:

    如果您的 html 元素具有相同的 Id,您可能会期望这种行为。我认为最简单的解决方案是将您的登录用户名 ID 名称重命名为更明确的名称,例如 LoginUserName。这样你就不会混合两种不同的东西。

    其次,我建议您(如果您还没有这样做)将您的登录功能封装到一个单独的表单中(如果适用),因为您将发送整个页面,包括不适用于登录操作。

    【讨论】:

    • 我现在将支持您的重命名,因为这是最实用和最直接的解决方案。但是,验证摘要仍然存在问题,因为我无法访问客户端 ID,因为我无法在属性中指定它。
    • 您能解释一下为什么您无权访问客户 ID 吗?据我所知,您可以使用模型绑定功能处理页面上的所有内容,只要您要处理的属性包含在您的模型类中(使用 @model yourmodel 在您的页面上)。我是对的还是你的其他问题?
    • 我的意思是对客户端 ID 的写入权限。我还没有尝试过@archil 关于绑定前缀的建议,但除此之外,ValidationSummary 暴露的 API 非常少。
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2018-11-11
    • 2014-05-31
    相关资源
    最近更新 更多