Аннотации UIHint и RegularExpression не работают вместе MVC4
Моя настоящая проблема была здесь: Проверка регулярного выражения Clinetside в 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 ответ
Вот вещь Ненавязчивая проверка на стороне клиента использует HTML5-атрибуты data-*, сгенерированные на вашем <input>
поля. Когда вы удаляете 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-*, чтобы ненавязчивая проверка работала должным образом.