Подтвердить что ты не робот

Пользовательский шаблон 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>
4b9b3361

Ответ 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.