Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc3非侵入性验证不生成客户端代码_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

Asp.net mvc3非侵入性验证不生成客户端代码

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"

由于某些原因,以“.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>

注意“需要数据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:(.感谢您的解决方案.)