0

我的实际问题在这里: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>
}
}

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

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

4

1 回答 1

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.TextBoxFor 之类的 HTML 助手仅在将它们放置在表单中时才会生成这些属性。所以你必须欺骗并手动实例化一个 FormContext 来欺骗助手认为它是在表单中使用的。实际上有一个Html.BeginForm但是这个表单在你的主视图中并且在模板里面帮助者不知道。称它为错误或其他任何东西,但事情就是这样。

所以你可以简单地在你的模板中创建一个 FormContext :

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

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

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

于 2013-07-30T06:01:21.520 回答