68

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>
4

7 に答える 7

144

私のアプローチは、カスタムを使用することです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>
}

この部分ビューを Shared フォルダーに配置し、コードから参照します。

@Html.Partial("_ValidationSummary", ViewData.ModelState);

このようにして、HTML を完全に制御できます。

于 2011-12-16T12:43:43.017 に答える
49

この質問では、カスタム検証の概要を記述する手順について詳しく説明します。

編集 これはあなたが望むことをします:

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();
    }
}

コードは一目瞭然です。モデル状態エラーを列挙し、選択した dom 要素にエラーをラップするだけです。次のように使用するとエラーが発生します。

<%:Html.MyValidationSummary()%>

ページ上の html タグをレンダリングするのではなく、テキストとして表示します。

<%=Html.MyValidationSummary()%>

これはうまくいきます。

于 2011-05-02T13:46:45.790 に答える
26

flos の回答に基づいて、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>

ここで詳細を読むことができます:

Bootstrap 3 パネルでスタイル設定されたカスタム ASP.NET MVC @Html.ValidationSummary の作成

このカスタム ValidationSummary の動作を示すために、サンプルの ASP.NET MVC プロジェクトも作成しました。ここで入手してください:

https://github.com/leniel/AspNetMvcCustomHtmlValidationSummary

于 2013-08-29T23:15:34.737 に答える
2

私にとってはうまくいっているので、ここに私の答えを投稿するだけです;)

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();
于 2014-03-12T12:51:46.440 に答える
1

サーバー側の検証のみ(ファイルの内容のチェックなど)に似たようなことをしなければならなかっただけで、 @Html.ValidationSummary を完全に奪ってしまいました。

Controller を拡張する BaseController クラスがあり、内部ではいくつかの目的で 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...");

そして出来上がり、ValidationSummary と同じ方法で渡されたエラーを含む、必要なスタイルを持つサーバー側の検証エラー メッセージ用の 1 つのカスタム コンテナーです。

于 2015-11-05T11:48:48.897 に答える
1

関連するスタイルの追加:

.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;
}

于 2015-06-16T06:36:09.470 に答える