Новая строка в сообщении ValidationMessage
Я тестирую список вещей для нуля. Каждый раз, когда я его нахожу, я сохраняю его в массив, чтобы реализовать его в проверочном сообщении.
Вывод, который я хочу, выглядит следующим образом:
Поле 1 обязательно для заполнения
Поле 4 обязательно для заполнения
так далее...
Но я не могу начать новую линию.
Теперь это выглядит так:
Поле 1 обязательно для заполнения Поле 4 обязательно для заполнения
Кто-нибудь знает, как этого добиться?
РЕДАКТИРОВАТЬ:
контроллер:
IDictionary<int, String> emptyFields = new Dictionary<int, String>();
foreach (Something thing in AnotherThing.Collection)
{
if (thing.Property == null)
emptyFields.add(thing.Index, thing.Name);
}
if (emptyFields.Any())
throw new CustomException() { EmptyFields = emptyFields };
Это исключение обрабатывается здесь:
catch (CustomException ex)
{
ModelState.AddModelError("file", ex.GetExceptionString());
return View("theView");
}
CustomException:
public class CustomException: Exception
{
public IDictionary<int,String> EmptyFields { get; set; }
public override String Label { get { return "someLabel"; } }
public override String GetExceptionString()
{
String msg = "";
foreach (KeyValuePair<int,String> elem in EmptyFields)
{
msg += "row: " + (elem.Key + 1).ToString() + " column: " + elem.Value + "<br/>";
}
return msg;
}
}
Посмотреть:
<span style="color: #FF0000">@Html.Raw(Html.ValidationMessage("file").ToString())</span>
7 ответов
Вы можете сделать это с этим одним вкладышем:
@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationMessageFor(m => m.Property).ToHtmlString()))
Вам нужно будет написать собственный помощник для достижения этой цели. Встроенный ValidationMessageFor
Помощник автоматически HTML кодирует значение. Вот пример:
public static class ValidationMessageExtensions
{
public static IHtmlString MyValidationMessageFor<TModel, TProperty>(
this HtmlHelper<TModel> htmlHelper,
Expression<Func<TModel, TProperty>> ex
)
{
var htmlAttributes = new RouteValueDictionary();
string validationMessage = null;
var expression = ExpressionHelper.GetExpressionText(ex);
var modelName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(expression);
var formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;
if (!htmlHelper.ViewData.ModelState.ContainsKey(modelName) && formContext == null)
{
return null;
}
var modelState = htmlHelper.ViewData.ModelState[modelName];
var modelErrors = (modelState == null) ? null : modelState.Errors;
var modelError = (((modelErrors == null) || (modelErrors.Count == 0))
? null
: modelErrors.FirstOrDefault(m => !String.IsNullOrEmpty(m.ErrorMessage)) ?? modelErrors[0]);
if (modelError == null && formContext == null)
{
return null;
}
var builder = new TagBuilder("span");
builder.MergeAttributes(htmlAttributes);
builder.AddCssClass((modelError != null) ? HtmlHelper.ValidationMessageCssClassName : HtmlHelper.ValidationMessageValidCssClassName);
if (!String.IsNullOrEmpty(validationMessage))
{
builder.InnerHtml = validationMessage;
}
else if (modelError != null)
{
builder.InnerHtml = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState);
}
if (formContext != null)
{
bool replaceValidationMessageContents = String.IsNullOrEmpty(validationMessage);
builder.MergeAttribute("data-valmsg-for", modelName);
builder.MergeAttribute("data-valmsg-replace", replaceValidationMessageContents.ToString().ToLowerInvariant());
}
return new HtmlString(builder.ToString(TagRenderMode.Normal));
}
private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)
{
if (!String.IsNullOrEmpty(error.ErrorMessage))
{
return error.ErrorMessage;
}
if (modelState == null)
{
return null;
}
var attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null;
return string.Format(CultureInfo.CurrentCulture, "Value '{0}' not valid for property", attemptedValue);
}
}
а потом:
public class MyViewModel
{
[Required(ErrorMessage = "Error Line1<br/>Error Line2")]
public string SomeProperty { get; set; }
}
и в представлении:
@model MyViewModel
@using (Html.BeginForm())
{
@Html.EditorFor(x => x.SomeProperty)
@Html.MyValidationMessageFor(x => x.SomeProperty)
<button type="submit">OK</button>
}
И если вы хотите отобразить сообщение об ошибке в ValidationSummary, вы также можете написать собственный помощник, который не будет HTML кодировать сообщение об ошибке, как я показал в this post
,
Попробуй это
присоединять
Отметьте после каждого сообщения об ошибке и используйте метод Html.Raw() для отображения вашего контента. Html.Raw будет декодировать HtmlContent.
you message like
Field 1 is required <br/>Field 4 is required<br/>
In View
Html.Raw("Yore Error Message")
В случае, если кто-то ищет его, вот как это сделать для сводки проверки:
@Html.Raw(HttpUtility.HtmlDecode(Html.ValidationSummary(true).ToHtmlString()))
Я немного опоздал на эту вечеринку, но только что столкнулся с этой проблемой, и использование простого старого css также работает хорошо:
<style>
.field-validation-error::after {
content: "\a";
white-space: pre;
}
</style>
Вы отображаете их в сводке проверки? Я не думаю, что он поддерживает HTML для разрывов строк и т. Д. Я бы создал собственный помощник HTML, основанный на сводке проверки, которая отображает HTML.
То же самое относится и к сообщению проверки, поэтому, вероятно, для этого нужно создать специальный помощник.
Что я делаю, это собираю их в div
<div class="Errors">
@Html.ValidationMessageFor(m => m.Name)<br/>
@Html.ValidationMessageFor(m => m.LName)<br />
</div>
затем создайте класс
.Errors {
color: red;
font-size: 10px;
font-weight: bold;
}
но если вы хотите сделать многострочную ошибку, то то, что упомянул Лайнель, является лучшим способом. Я собираю их, потому что некоторые пользователи не увидят ошибку с длинными формами, и они просто начнут звонить нам.. ^^,