【问题标题】:mvc3 Unobtrusive validation not generating client codemvc3 不显眼的验证不生成客户端代码
【发布时间】:2011-07-22 17:42:31
【问题描述】:

由于某些原因,以“.value”或 .anything 命名的字段不会生成客户端验证。例如这段代码:

@Html.TextArea("ContentObjectFirm.Description")

生成这个:

<textarea rows="2" name="ContentObjectFirm.Description" id="ContentObjectFirm_Description" data-val-required="Firm description is required" data-val="true" cols="20"></textarea>

注意“data-val-required”

现在,我需要拥有名为“ContentObjectFirm.Description.Value”的字段 - 我在这里使用自定义活页夹(但与我的问题无关)。底线是,我需要在字段名称中包含“.Value”。所以,

对于此代码: @Html.TextArea("ContentObjectFirm.Description.Value")

文本区域助手生成:

<textarea rows="2" name="ContentObjectFirm.Description.Value" id="ContentObjectFirm_Description_Value" cols="20"></textarea>

模型类:

[Required(ErrorMessageResourceName = "fld_Description_val_Required", ErrorMessageResourceType = typeof(Resources.Service.Controllers.Firm))]
[Display(Name = "fld_Description_lbl", ResourceType = typeof(Resources.Service.Controllers.Firm))]
public MultilanguageProperty<string> Description
{
    get
    {
        return this.GetMultilanguageProperty("Description", string.Empty, this);
    }

    set
    {
        this.SetMultilanguageProperty("Description", value);
    }
}

MultilanguageProperty 是我的自定义界面(不重要)..当使用“字符串描述”时它仍然不起作用。

如何才能添加不显眼的验证码?为什么添加.value字符串时会跳过?

谢谢

【问题讨论】:

  • 您好,您可以提供模型类进行分析吗?

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


【解决方案1】:

默认 HtmlHelper 使用您提供的名称,用于从模型中查找 MetaData 和 ValidationAttributes。如果名称与属性不对应,HtmlHelper 将找不到这些信息。最好的解决方案似乎是创建一个自定义 HtmlHelper 扩展,它可能看起来像这样:

public static class CustomTextAreaExtensions
{
    public static MvcHtmlString CustomNameTextArea(this HtmlHelper htmlHelper, string name, string metadataPropertyName)
    {
        string fullName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

        TagBuilder tagBuilder = new TagBuilder("textarea");
        tagBuilder.GenerateId(fullName);
        tagBuilder.MergeAttribute("rows", "2", true);
        tagBuilder.MergeAttribute("cols", "20", true);
        tagBuilder.MergeAttribute("name", fullName, true);

        ModelState modelState;
        if (htmlHelper.ViewData.ModelState.TryGetValue(fullName, out modelState) && modelState.Errors.Count > 0)
            tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);

        tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(metadataPropertyName));

        ModelMetadata modelMetadata = ModelMetadata.FromStringExpression(metadataPropertyName, htmlHelper.ViewContext.ViewData);
        string value;
        if (modelState != null && modelState.Value != null)
            value = modelState.Value.AttemptedValue;
        else if (modelMetadata.Model != null)
            value = modelMetadata.Model.ToString();
        else
            value = String.Empty;
        tagBuilder.SetInnerText(Environment.NewLine + value);

        return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));
    }
}

在 web.config 中注册正确的命名空间后,您将能够像这样使用此扩展方法:

@Html.CustomNameTextArea("ContentObjectFirm.Description.Value", "ContentObjectFirm.Description")

这应该会给你想要的输出。

【讨论】:

  • 积极的:它有效:)。谢谢。否定:我必须为(在我的情况下)多语言属性将使用的每种类型创建一个,即:文本框,文本区域:(。感谢您的解决方案。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2013-05-28
  • 2012-11-16
  • 2012-07-11
  • 1970-01-01
相关资源
最近更新 更多