mvc3不显眼的验证不生成客户端代码

时间:2011-03-25 07:50:39

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

由于某些原因,以“.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是我的自定义界面(不重要)..当使用'string Description'时它仍然不起作用。

如何制作以便添加不显眼的验证码?为什么在添加.value字符串时跳过它?。

感谢

1 个答案:

答案 0 :(得分: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")

这应该可以提供所需的输出。