【问题标题】:implementing ValidationMessageFor实施 ValidationMessageFor
【发布时间】:2010-04-21 07:54:32
【问题描述】:

我今天正在将 MVC1 应用程序迁移到 MVC2,在将 ValidationMessage 更改为 ValidationMessageFor 实现时遇到了问题。

以下是我的视图中的选择列表

<%=Html.DropDownListFor(model => model.SecurityQuestions[0].Question,  "Some Security question", new { @class = "form_element_select" })%>

以下代码运行良好,我可以看到验证消息来自模型状态。

<%= Html.ValidationMessage("SecurityQuestions_0__Question")%> 

但是这个不行:

<%= Html.ValidationMessageFor(model => model.SecurityQuestions[0].Question)%>

SecurityQuestions 是我模型中的通用列表

public List<SecurityQuestion> SecurityQuestions { get; set; }

这是“ValidationMessageFor”中的一个错误还是我在这里遗漏了什么?

我之前问过this question on asp.net forums

【问题讨论】:

  • 你说它不起作用,但实际上是什么问题?它会引发编译错误吗?运行?它不渲染吗?绑定?
  • 它不验证。我没有看到错误消息。

标签: asp.net validation asp.net-mvc-2


【解决方案1】:

问题在于 ValidationMessageFor 仅使用最后一个属性名称作为验证消息键。

在您的情况下,这意味着:

<%= Html.ValidationMessageFor(model => model.SecurityQuestions[0].Question) %>

等于

<%= Html.ValidationMessage("Question") %>

并不是你想象的那样。不幸的是,在这种情况下,您将不得不使用非强类型帮助器来获得应有的整个字符串。

【讨论】:

  • 不能作为 Html.DropDownListFor(model => model.SecurityQuestions[0].Question... 的渲染客户端 ID 输出工作SecurityQuestions_0__Question 并意识到您正在视图中显示通用列表的多个索引。
  • @Murat:我知道它不起作用,这就是为什么我建议你在这种特殊情况下使用非强类型帮助器。
  • 由于 SecurityQuestions_0__Question 是下拉列表的渲染输出,因此 Html.ValidationMessageFor 也应该渲染相同的客户端 ID。你认为这是一个错误还是什么?
【解决方案2】:

这个问题在 MVC V3 中已修复

【讨论】:

    【解决方案3】:

    您可以在 ValidationMessageFor 生成的键下向 ModelState 添加您想查看的错误。 当然它是一个黑客,但最快的方式去。而且它不会在您的标记中添加任何丑陋的 "SecurityQuestions_0__Question"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2022-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多