【问题标题】:Validating dropdown in MVC4, data-val attributes not generated验证 MVC4 中的下拉列表,未生成 data-val 属性
【发布时间】:2013-11-01 17:03:36
【问题描述】:

我在 MVC4 中的下拉列表上进行不显眼的验证时遇到了可怕的困难。

我看到的主要症状是 data-val 属性未呈现在下拉元素上。

根本原因是 DropDownFor 正在查看编辑器模板的模型,该模型没有任何验证属性。验证在父对象属性/主模型上。我正在使用@DarinDimitrov 在这篇文章中建议的下拉实现:https://stackoverflow.com/a/17760548/89092

是否有人知道基于模型值实现下拉框的模式,该模型值是具有选定标志的密钥对列表并经过不显眼的验证?

我希望能够在编辑器模板中调用 Html.GetUnobtrusiveValidationAttributes(),附加属性并保留我拥有的代码 - 但对于我的一生,我无法弄清楚如何从中获取任何数据- 我认为这是因为我此时拥有的 ViewData.ModelMetadata 的范围仅限于 DropDownValues 类型,而不是具有装饰属性 test_dd 的主模型,但如果有人知道将什么谜语输入这个小黑盒子,那么会很好。

我的模特:

...
[Required]
[UIHint("SelectListItemDD")]    
public DropDownValues test_dd { get; set; }
...

这是 DropDownValues 视图模型

public class DropDownValues : IDropDownValues
{
    public string SelectedValue { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

我的编辑器模板视图模型

@model  DropDownValues
@{
    string initial = (ViewData.ModelMetadata).AdditionalValues["InitialValue"] as string;
}
@{if (Model != null && Model.Items != null && Model.Items.Count() > 0)
  {
    @Html.DropDownListFor(x => x.SelectedValue,
    new SelectList(Model.Items, "Value", "Text"), initial)
  }
}

【问题讨论】:

  • 您的 Value 属性确实是字符串吗?可能是 SelectedValue 应该是一个 int。
  • 谢谢@Romias option标签上的value属性会是一个字符串,这是一种代码,就像产品代码一样,内部文本是描述,因此是字典的底层模型。但是将其更改为 int 然后稍后查找可以解决问题,然后我就全神贯注了:-)

标签: c# asp.net-mvc asp.net-mvc-4 unobtrusive-validation html.dropdownlistfor


【解决方案1】:

我希望得到这个问题的真实答案 - 同时,这是我的解决方法。

即使我开发了一个区域设置感知必需属性,我也不得不在我的模型中复制它的功能(我有一个只提供全局资源的自定义资源提供程序,因此这不适用于当前的 MVC 本地化方案属性:-((()

使用来自我的模型的本地化消息,我手动添加了 data-val 属性 :-(((

这里是编辑器模板:

@model  DropDownValues

@{
    string initial = null;

    if (Model != null && !string.IsNullOrWhiteSpace(Model.InitialValue))
    {
        initial = Model.InitialValue;
    }

    object attrributes;
}

@{if (Model != null && Model.Items != null && Model.Items.Count() > 0)
  {
      if (Model.Required)
      {
          attrributes = new
          {
              data_val_required = Model.RequiredValidationMessage,
              data_val = "true"
          };
      }
      else
      {
          attrributes = null;
      }

    @Html.DropDownListFor(x => x.SelectedValue,
    new SelectList(Model.Items, "Value", "Text"), initial, attrributes)
  }
}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题并找到了解决方案。当我只使用“名称”参数调用 GetUnobtrusiveValidationAttributes 时,它没有返回任何属性。如果我添加了元数据属性,它会返回属性。这是一个示例调用:

    public static MvcHtmlString DropDownListCustom<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, IEnumerable<SelectListItem> selectList, IDictionary<string, object> htmlAttributes)
    {
        var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
        var atts = html.GetUnobtrusiveValidationAttributes(metadata.PropertyName, metadata);
    }
    

    在我的例子中,'atts' 字典现在有 2 个必填字段值:data-val 和 data-val-required。我有 2 个必填字段,但只有一个可以正常工作。这是我在调用 GetUnobtrusiveValidationAttributes 之后添加的代码:

        if (atts != null && atts.Count > 0)
        {
            foreach (var attr in atts)
            {
                htmlAttributes.Add(attr.Key, attr.Value);
            }
        }
    

    ...然后再下这个电话:

        builder.AppendLine(html.DropDownList(metadata.PropertyName, selectList, htmlAttributes).ToString());
    

    请注意,一旦您调用 GetUnobtrusiveValidationAttributes,如果您再次尝试调用它,您将一无所获。这就是为什么我必须在所有情况下自己添加属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 2011-10-20
      • 2013-09-18
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多