Asp.net mvc3非侵入性验证不生成客户端代码
由于某些原因,以“.value”或“.anything”命名的字段不会生成客户端验证。例如,此代码:Asp.net mvc3非侵入性验证不生成客户端代码,asp.net,asp.net-mvc,asp.net-mvc-3,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"
@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>
注意“需要数据val”
现在,我需要一个名为“ContentObjectFirm.Description.Value”的字段——我在这里使用一个自定义活页夹(与我的问题无关)。底线是,我需要在字段的名称中包含“.Value”。所以
对于此代码:
@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);
}
}
[必需(ErrorMessageResourceName=“fld_Description_val_Required”,ErrorMessageResourceType=typeof(Resources.Service.Controllers.Firm))]
[显示(Name=“fld\u Description\u lbl”,ResourceType=typeof(Resources.Service.Controllers.Firm))]
公共多语言属性描述
{
得到
{
返回此.GetMultilanguageProperty(“Description”,string.Empty,this);
}
设置
{
此.SetMultilanguageProperty(“描述”,值);
}
}
其中MultilanguageProperty是我的自定义接口(不重要)…当使用“字符串描述”时,它仍然不起作用
我如何才能添加不引人注目的验证代码?为什么在添加.value字符串时跳过它
谢谢默认的HtmlHelper使用您提供的名称从模型中查找元数据和验证属性。如果名称与属性不一致,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));
}
}
@Html.CustomNameTextArea("ContentObjectFirm.Description.Value", "ContentObjectFirm.Description")
在web.config中注册正确的命名空间后,您将能够像这样使用此扩展方法:
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));
}
}
@Html.CustomNameTextArea("ContentObjectFirm.Description.Value", "ContentObjectFirm.Description")
这将为您提供所需的输出。Hi,您可以提供模型类进行分析吗?正面:它可以工作:)。谢谢否定:我必须为(在我的情况下)多语言属性将使用的每种类型创建一个,即:textbox,textarea:(.感谢您的解决方案.)