由于某些原因,以“.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字符串时跳过它?。
感谢
答案 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")
这应该可以提供所需的输出。