Аннотации 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-*, чтобы ненавязчивая проверка работала должным образом.

Другие вопросы по тегам