我的实际问题在于: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>
}
}
不确定这是否会导致任何问题。
有人可以告诉我这里做错了什么吗?
答案 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- *属性,以便不引人注意的验证按预期工作。