【问题标题】:Multiple textboxfor, same model. ValidationMessageFor not working多个文本框,相同的模型。 ValidationMessageFor 不工作
【发布时间】:2014-12-01 16:35:35
【问题描述】:

我的所有文本框验证都无法正常工作。仅在一次使用“一个”时。 我正在尝试对我的变体使用相同的模型属性。有谁知道这个问题的解决方案,或者更好的方法?

@Html.Hidden("AggKPIID", item.AggKPIID)
@if (item.Värde.ToString() == "-1" || item.Värde.ToString() == "0")
{                   
  @Html.TextBoxFor(modelItem => item.Värde, new { Value = "", Name = "Värde", @class = "kpiTextbox kpiTextbox-edit", @id = "tb"+Id })
  <br />
  @Html.ValidationMessageFor(modelItem => item.Värde)
}
else
{
  @Html.TextBoxFor(modelItem => item.Värde, new { @class = "kpiTextbox kpiTextbox-edit", @id = "tb" + Id })
  <br />
  @Html.ValidationMessageFor(modelItem => item.Värde)
}    
@Html.Hidden("Tidsperiod", item.Tidsperiod)
@Html.Hidden("Id", Id)

【问题讨论】:

    标签: asp.net-mvc html.textboxfor validationmessage


    【解决方案1】:

    您尚未显示完整的代码,但您似乎在 foreach 循环中呈现此代码。这将生成重复的 id 属性(无效的 html)和 name 属性,因此无论如何它都不会回发到您的收藏中。因为名称属性都是一样的,所以关联的验证错误是无法匹配的。更改您的视图以使用for 循环(模型需要为IList&lt;T&gt;,或者您可以使用自定义EditorTemplate。注意我不明白您if 语句在做什么(这没有意义)如果您想将Värde 的值更改为空字符串(如果其值为0-1),则在将模型传递给视图之前在控制器中执行此操作。

    for(int i = 0, i < Model.Count; i++)
    {
      @Html.HiddenFor(m => m[0].AggKPIID)
      @Html.TextBoxFor(m => m[0].Värde, new { @class = "kpiTextbox kpiTextbox-edit" })
      @Html.ValidationMessageFor(m => m[0].Värde)
      @Html.HiddenFor(m => m[0].Tidsperiod)
      @Html.HiddenFor(m => m[0].Id)
    }
    

    并且总是使用强类型帮助器并且不要尝试更新name 属性(不是new { Name = "Värde" } 无论如何都会做任何事情)

    【讨论】:

    • 嘿。你对我使用 foreach 是对的。我明白你在说什么。这是来自表格内的部分视图。这部分仅适用于文本框。关于强类型助手,我相信我已经修改它们以更适合我的更新视图模型。由于是发送 item.Värde,而 VM 只能接 Värde。
    • 如果您使用局部视图以表单形式呈现控件以回发到作为集合的模型或包含作为集合的属性的模型,您将遇到问题。您没有发布足够的代码来确定,但您应该始终使用 EditorTemplatefor 循环进行集合,以确保使用索引器正确命名控件(name="[0].AggKPIID"name="[1].AggKPIID" 等)跨度>
    • 这是在 Ajax beginform 中。而且我没有更新任何视图。只使用onsuccess和onfailure。所以我的动作返回 Json。如果更新顺利,我会使用 jquery 显示“正常”图像。但你是对的:)
    【解决方案2】:

    你应该只能定义一次

    @{var attrs = null;}
    @if (item.Värde.ToString() == "-1" || item.Värde.ToString() == "0")
    {
        attrs = new { Value = "", @class = "kpiTextbox kpiTextbox-edit", @id = "tb" + Id };
    }
    else
    {
        attrs = new { @class = "kpiTextbox kpiTextbox-edit", @id = "tb" + Id };
    }
    @Html.TextBoxFor(modelItem => item.Värde, attrs)
    <br />
    @Html.ValidationMessageFor(modelItem => item.Värde)
    

    我也不建议设置Name

    【讨论】:

    • 谢谢伙计。如果我不使用 foreach,它会与您的解决方案一起正常工作。我没有提供足够的信息:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多