1

我在 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)
  }
}
4

2 回答 2

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)
  }
}
于 2013-11-05T14:17:12.263 回答
1

我遇到了同样的问题并找到了解决方案。当我只使用“名称”参数调用 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,如果您再次尝试调用它,您将一无所获。这就是为什么我必须在所有情况下自己添加属性。

于 2014-03-28T14:42:32.890 回答