UIHint和RegularExpression注释不能一起使用MVC4

时间:2013-07-30 05:38:55

标签: regex asp.net-mvc-4 asp.net-mvc-uihint

我的实际问题在于:Clinetside regular expression validation in MVC4

我的模特是:

public partial class PartyRole
{
[UIHint("TextBox")]
[RegularExpression(@"^.{5,}$", ErrorMessage="Minimum 5 characters required")]
[StringLength(50, ErrorMessage="Maximum {2} characters exceeded")]
public string Title { get; set; }
}

我的uihint模板(TextBox.cshtml)

@Html.TextBoxFor(m => Model, new {@class="txt"})

如果我不使用UIHint,则所有验证消息都会呈现给客户端。 如果我使用UIHInt,则不会在客户端生成正则表达式的验证属性,并且验证是从服务器进行的。

另外,我已经覆盖了object.cshtml

@functions
{
bool ShouldShow (ModelMetadata metadata)
{
    return metadata.ShowForEdit
        && metadata.ModelType != typeof(System.Data.EntityState)
        && !metadata.IsComplexType
        && !ViewData.TemplateInfo.Visited(metadata);
}
}

@if (ViewData.TemplateInfo.TemplateDepth > 1)
{
if (Model == null)
{
    @ViewData.ModelMetadata.NullDisplayText
}
else
{
    @ViewData.ModelMetadata.SimpleDisplayText
}
}
else
{
ViewData.Clear();

foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => ShouldShow(pm)))
{
    if (prop.HideSurroundingHtml)
    {
        @Html.Editor(prop.PropertyName)
    }
    else if (prop.DisplayName == "Id")
    {
        <div></div>   
    }
    else if (!string.IsNullOrEmpty(Html.Label(prop.PropertyName).ToHtmlString()))
    {
        <div class="editor-label">@Html.Label(prop.PropertyName)</div>
    }
    <div class="editor-field">@Html.Editor(prop.PropertyName) @Html.ValidationMessage(prop.PropertyName, "")</div>
}
}

不确定这是否会导致任何问题。

有人可以告诉我这里做错了什么吗?

1 个答案:

答案 0 :(得分:1)

这就是事情。不显眼的客户端验证使用在<input>字段上生成的HTML5 data- *属性。删除UIHint后,您的自定义模板将不再使用,如果您检查生成的标记,您会看到<input>字段上有data-*个属性:

<input class="input-validation-error text-box single-line" data-val="true" data-val-length="Maximum 0 characters exceeded" data-val-length-max="50" data-val-regex="Minimum 5 characters required" data-val-regex-pattern="^.{5,}$" id="Title" name="Title" type="text" value="1" />

现在,如果您放置UIHint并查看生成的HTML,您会看到:

<input class="txt" id="Title" name="Title" type="text" value="some title" />

好吧,这就解释了为什么你的代码无法正常工作。

现在您可能想知道为什么模板中没有data- *属性?因为HTML帮助程序(如Html.TextBoxFor)仅在将它们放在表单内时才生成这些属性。因此,您必须作弊并手动实例化FormContext,以欺骗帮助程序,使其认为它在表单中使用。实际上有一个Html.BeginForm,但是这个表单在你的主视图中,在帮助器不知道的模板内。把它称为一个错误或其他什么,但它是如何做的。

所以你可以在模板中创建一个FormContext:

@{
    this.ViewContext.FormContext = new FormContext();
}

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class="txt" })

现在您的<input>字段将具有必要的data- *属性,以便不引人注意的验证按预期工作。

相关问题