Пользовательский шаблон ValidationSummary Asp.net MVC 3
Я работаю над проектом с Asp.Net MVC3
В представлении у меня есть @Html.ValidationSummary(true)
и, как обычно, он создает
<div class="validation-summary-errors">
<ul>
<li>Something bad Happened!</li>
</ul>
</div>
Как я могу расширить этот ValidationSummary до MyValidationSummary и выдает шаблон HTML-кода примерно так:
<div class="notification warning">
<span></span>
<div class="text"> <p>Something bad Happened!</p> </div>
</div>
Ответы
Ответ 1
В этом question подробно описывается процедура написания сводки пользовательской проверки.
ИЗМЕНИТЬ
Это сделает то, что вы хотите:
public static class LinqExt
{
public static string MyValidationSummary(this HtmlHelper helper, string validationMessage="")
{
string retVal = "";
if (helper.ViewData.ModelState.IsValid)
return "";
retVal += "<div class='notification-warnings'><span>";
if (!String.IsNullOrEmpty(validationMessage))
retVal += helper.Encode(validationMessage);
retVal += "</span>";
retVal += "<div class='text'>";
foreach (var key in helper.ViewData.ModelState.Keys)
{
foreach(var err in helper.ViewData.ModelState[key].Errors)
retVal += "<p>" + helper.Encode(err.ErrorMessage) + "</p>";
}
retVal += "</div></div>";
return retVal.ToString();
}
}
Код является самоочевидным; просто перечисляя ошибки modelstate и обертывая ошибки в элементе dom по вашему выбору. Существует ошибка, если я использую ее как:
<%:Html.MyValidationSummary()%>
Он будет отображать html-теги на странице как текст, а не показывать его.
<%=Html.MyValidationSummary()%>
Это отлично работает.
Ответ 2
Мой подход заключается в использовании пользовательского ValidationSummary.cshtml
:
@model ModelStateDictionary
@if(!Model.IsValid)
{
<div class="validation-summary-errors">
<ul>
@foreach (var modelError in
Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
{
<li>@modelError.ErrorMessage</li>
}
</ul>
</div>
}
Поместите этот частичный вид в свою общую папку и обратитесь к нему из вашего кода:
@Html.Partial("_ValidationSummary", ViewData.ModelState);
Таким образом, вы полностью контролируете свой html.
Ответ 3
Основываясь на flos answer, я сделал его совместимым с Microsoft jQuery Unobtrusive Validation и добавил стиль панели Bootstrap 3. Здесь новый код:
@model ModelStateDictionary
<div class="@(Html.ViewData.ModelState.IsValid ? "validation-summary-valid" : "validation-summary-errors") panel panel-danger"
data-valmsg-summary="true">
<div class="panel-heading">
Please, correct the following errors:
</div>
<div class="panel-body">
<ul>
@foreach(var modelError in Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
{
<li>@modelError.ErrorMessage</li>
}
</ul>
</div>
</div>
Вы можете прочитать об этом подробнее здесь:
Создание пользовательского ASP.NET MVC @Html.ValidationSummary в стиле с панелью Bootstrap 3
Я также создал образец проекта ASP.NET MVC, чтобы показать этот пользовательский ValidationSummary в действии. Получите его здесь:
https://github.com/leniel/AspNetMvcCustomHtmlValidationSummary
Ответ 4
Просто отправьте мой ответ здесь, потому что он хорошо работает для меня;)
Я использую простой метод расширения, который принимает MvcHtmlString
и декодирует его обратно в HTML:
public static MvcHtmlString ToMvcHtmlString(this MvcHtmlString htmlString)
{
if (htmlString != null)
{
return new MvcHtmlString(HttpUtility.HtmlDecode(htmlString.ToString()));
}
return null;
}
Чтобы включить это, я добавляю помощник сводки проверки в мой chstml следующим образом:
@Html.ValidationSummary(true).ToMvcHtmlString()
Это означает, что я могу добавить пользовательский HTML в сводные сводки:
ModelState.AddModelError("", "<p>This message can have html in it</p>");
И я даже могу добавить пользовательский HTML в мои сообщения о проверке поля:
ModelState.AddModelError("MyField", "<p>This message can have html in it</p>");
И чтобы мои сообщения проверки поля работали с HTML:
@Html.ValidationMessageFor(model => model.MyField).ToMvcHtmlString();
Ответ 5
Добавление связанных стилей:
.field-validation-error {
color: #b94a48;
}
.field-validation-valid {
display: none;
}
input.input-validation-error {
border: 1px solid #b94a48;
}
input[type="checkbox"].input-validation-error {
border: 0 none;
}
.validation-summary-errors {
color: #b94a48;
}
.validation-summary-valid {
display: none;
}
Ответ 6
Я хотел показать только сообщение верхнего уровня и ничего больше. У нас уже есть валидация рядом с полями ниже. Работая с решением Leniel-Macaferi, это то, что я сделал, чтобы заставить его работать с проверкой jQuery: (добавлено style = "display: none;" )
<div class="@(Html.ViewData.ModelState.IsValid ? "validation-summary-valid" : "validation-summary-errors")"
data-valmsg-summary="true">
<div>
There are still some fields not filled in before we can submit this. Please correct.
</div>
<div style="display: none;">
<ul>
@foreach (var modelError in Model.SelectMany(keyValuePair => keyValuePair.Value.Errors))
{
<li>@modelError.ErrorMessage</li>
}
</ul>
</div>
</div>
Ответ 7
Мне просто нужно было сделать что-то подобное только для проверки на стороне сервера (например, проверить содержимое файла) и полностью узурпировали @Html.ValidationSummary в целом с довольно приятной работой.
У нас есть класс BaseController, который расширяет Controller, и внутри мы переопределяем метод OnActionExecuting для нескольких целей.
Мы создаем новый список в ViewBag для наших сообщений об ошибках и гарантируем, что перед выполнением каких-либо действий он инициализируется. Затем мы можем добавить наши ошибки для отображения на экран и отобразить на экране.
Для целей этого вопроса это будет выглядеть так.
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (ViewBag.ErrorsList == null)
{
ViewBag.ErrorsList = new List<string>();
}
}
}
Затем в нашем _Layout.cshtml добавьте следующее выше ваше @RenderBody()
@if(ViewBag.ErrorsList.Count > 0)
{
<div class="container margin-top-10 alert alert-danger">
<h3><i class="glyphicon glyphicon-warning-sign"></i></h3><br/>
@foreach (string error in @ViewBag.ErrorsList)
{
@error <br/>
}
</div>
@RenderBody()
}
Теперь, когда возникает ошибка на стороне сервера, которую мы хотим отобразить в качестве сообщения об ошибке проверки, мы просто добавляем его в наш ViewBag.ErrorsList
ViewBag.ErrorsList.Add("Something bad happened...");
И voila, один пользовательский контейнер для сообщений об ошибках проверки на стороне сервера с любыми стилями, которые вы хотите на нем, с ошибками, переданными таким же образом, как и ValidationSummary.