#asp.net-mvc #asp.net-mvc-4 #razor #mvc-editor-templates
#asp.net-mvc #asp.net-mvc-4 #razor #mvc-редактор-шаблоны
Вопрос:
У меня есть простая модель:
public abstract class Person
{
[Required(ErrorMessage = "Il nome è obbligatorio!!!")]
[UIHint("txtGeneric")]
[Display(Name = "Nome")]
public string Name { get; set; }
[Required(ErrorMessage = "Il cognome è obbligatorio!!!")]
[UIHint("txtGeneric")]
[Display(Name = "Cognome")]
public string Surname { get; set; }
[Required(ErrorMessage = "L'email è obbligatoria e deve essere in formato valido (nome@dominio.it)!!!")]
[UIHint("txtEmail")]
[Display(Name = "E-mail")]
public string Email { get; set; }
}
Я создал внутри EditorTemplate файл txtGeneric.cshtml. Это похоже на это:
@model string
<input name="@ViewData.TemplateInfo.HtmlFieldPrefix" id="@ViewData.TemplateInfo.HtmlFieldPrefix" data-validation="required" data-validation-error-msg="MESSAGE_TO_PUT" value="@Model" />
Я хочу знать, как использовать текстовое сообщение об ошибке требуемого атрибута для помещения в мой txtGeneric.cshtml-файл.
Как я могу это сделать?
Спасибо
Комментарии:
1. Существует два способа установить проверку. 1. @Html.ValidationSummary() // для полной модели 2. @Html.ValidationMessageFor(/*выражение */) // для выбранного свойства модели. Кажется, вам не хватает помощника по проверке.
2. Да, я знаю, что вспомогательный snd для проверки, который я добавлю раньше, то, что я хочу, немного отличается… Я хочу получить текстовое значение сообщения для required, которое я устанавливаю в модель внутри шаблона custon (для пользовательских целей javascript) … возможно ли это?!?
3. Вы можете использовать jquery и извлекать внутренний текст. проверьте отрисованный html-код помощника по проверке и получите его внутренний текст.
4. Мммм, неужели невозможно получить доступ к этому значению непосредственно в editortemplate ?!? Я хочу заполнить свойство самого шаблона
Ответ №1:
Это работает:
@{
string requiredMsg = "";
foreach (var attr in @Html.GetUnobtrusiveValidationAttributes(@ViewData.TemplateInfo.HtmlFieldPrefix, @ViewData.ModelMetadata))
{
if (attr.Key == "data-val-required") {
requiredMsg = attr.Value.ToString();
}
}
}
или это:
@{
string requiredMsg = "";
IEnumerable<ModelClientValidationRule> clientRules = ModelValidatorProviders.Providers.GetValidators(ViewData.ModelMetadata, ViewContext).SelectMany(v => v.GetClientValidationRules());
foreach (ModelClientValidationRule rule in clientRules)
{
if (rule.ValidationType == "required")
{
requiredMsg = rule.ErrorMessage;
}
}
}
Ответ №2:
Измените свой шаблон на этот:
@model string
@Html.TextBoxFor(m => m)
@Html.ValidationMessageFor(model => model, "", new { @class = "text-danger" })
Комментарии:
1. Таким образом, сообщение о проверке должно находиться за пределами поля ввода, сгенерированного editortemplate … я хочу получить доступ только к тексту, и я хочу поместить внутрь самого результата ввода
2. Считайте значение
data-val-required
атрибута из генерируемого ввода<input data-val="true" data-val-required="Il nome è obbligatorio!!!" id="Name" name="Name" type="text" value="">
3. Нет, извините, но мой английский плох, как и мое объяснение. Я хочу получить текст сообщения внутри EditorTemplates что-то вроде @ViewData. TemplateInfo.HtmlFieldPrefix но для требуемого сообщения
4. @pinguinone Если вы используете
@Html.EditorFor(m => m)
, как предложил Мохсен, стандартный шаблон редактора будет использовать аннотации данных для создания соответствующих атрибутов data-val. Другими словами, вам не нужно ничего делать, если вы не собираетесь предоставлять пользовательские аннотации к данным. Но это совершенно отдельная проблема.