18

ASP.NET MVC に接続されている jQuery 検証の基本のいくつかを理解するのに苦労しています。

この質問の短いバージョンは次のとおりです: によって生成されたコード@Html.EditorFor()が jQuery 検証を実行できるようにするために、どの魔法が欠けていますか?

学習課題として (そして、Web サイトで実際にやりたいことを模倣しているため)、Visual Studio 2012 で新しい MVC 4 アプリを作成しました。ビュー モデルを追加しました。

using System.ComponentModel.DataAnnotations;
namespace ValidationTest.Models
{
    public class MyViewModel
    {
        [Required]
        public string MyStringValue { get; set; }
    }
}

Views\Home\Index.cshtml を変更して、ビュー モデルに基づいて次のようなフォームを作成しました。

@model ValidationTest.Models.MyViewModel
@using (Html.BeginForm(new { id = "MyForm" })) {
    @Html.LabelFor(m => m.MyStringValue)
    @Html.EditorFor(m => m.MyStringValue)
    @Html.ValidationMessageFor(m => m.MyStringValue)

    <br />
    <input type="submit" value="Submit" />
}

最後に、ビュー モデルをフォームに提供し、関連する POST を処理するように Home コントローラーを次のように変更しました。

using System.Web;
using System.Web.Mvc;
using ValidationTest.Models;

namespace ValidationTest.Controllers
{
    public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            var viewModel = new MyViewModel();
            return View(viewModel);
        }

        [HttpPost]
        public ActionResult Index(MyViewModel viewModel)
        {
            if (!ModelState.IsValid) return View(viewModel);

            return RedirectToAction("About");
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your app description page.";
            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";
            return View();
        }
    }
}

プロジェクトを実行すると、Web ページにテキスト ボックスが表示され、ユーザーが値を入力する必要があることが魔法のように検証されます。ここまでは順調ですね...

さて、私の実際のアプリはオンライン調査です。スクリプトに基づいて質問を表示し、回答を求めます。私の実際のビューモデルには、質問のテキスト、ユーザーによって提供された値などにマップされるプロパティが含まれています。ビューモデルには、ユーザーが値を提供する必要があるかどうか (つまり、有効にするかどうか) を指定する Boolean Required プロパティも含まれています。ビューでの「必須」検証) - これは[Required]、viewmodel の MyStringValue プロパティの属性を削除し、viewmodel の Required プロパティに基づいて独自の検証マジックを提供する必要があることを意味します。

これは私が迷子になるところです。IE では、サンプル アプリ (上で概説) の @html.xxx 呼び出しがフォームの次の HTML を生成することがわかります。

<label for="MyStringValue">MyStringValue</label>
<input  class="text-box single-line" 
        data-val="true" 
        data-val-required="The MyStringValue field is required." 
        id="MyStringValue" 
        name="MyStringValue" 
        type="text" 
        value="" />
<span data-valmsg-for="MyStringValue" data-valmsg-replace="true"></span>

しかし、明らかに jQuery 検証ライブラリを参照している HTML はページのどこにも見当たりませんし、検証を可能にする JavaScript コードも見当たりません。

さらに、[Required]属性を削除し、ビューをハードコーディングして上記の HTML を出力すると (魔法の @html.xxx() 呼び出しなしで)、検証はまったく行われません。

私は何が欠けていますか?

4

2 に答える 2

14

はい、私は本当に基本的な何かを逃していました。

新しいMVC4プロジェクト用に作成されたページテンプレート(_Layout.cshtml)には、ページの最後に次のコードが含まれています。

        @Scripts.Render("~/bundles/jquery")
        @RenderSection("scripts", required: false)
    </body>
</html>

そのコードは(ページ上のすべてのHTMLがブラウザーに表示された後)jQueryライブラリーをプルし、ビューによって提供できるオプションの「セクション」をレンダリングします。そのコードはjQuery検証ライブラリをプルしません。

ASP.NET MVC検証はjQuery検証なしで機能しますが、すべての検証はサーバーで行われます。注意深い観察者は、欠落している文字列値を指定する必要があることを警告すると、クライアント側の検証により、問題のあるテキストボックスに1文字を入力するだけで警告が消えることに注意します。ただし、jQuery検証が有効になっていない場合、テキストボックスに入力しても、警告は動的に削除されません。

単一のビューに対してjQuery検証を「オン」にするには、このコードをビューのcshtmlファイルのどこかに配置する必要があります(スタイル的には、HTMLの最後に表示されるため、ファイルの最後に配置する必要があります)。 :

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

したがって、私の質問に対する簡単な答えは、Views \ Home\Index.cshtmlファイルの最後に上記のコードを追加することです。これにより、jQueryの検証が可能になり、魔法が起こり、data-xxx属性が無視されなくなります。人生は素晴らしい。

于 2013-03-04T02:01:39.557 に答える
11

あなたに欠けている魔法はありません。Microsoft の「控えめな検証」スクリプトは、jquery および jquery validate を使用するすべての Web サイトで使用できます。ASP.NET とは関係ありません。HTML が目立たないスクリプトが期待する形式である限り、スクリプトは機能します。 このフィドルは、ASP.NET によって生成されていないフォームに適用される目立たないスクリプトを示しています

目立たないスクリプトには、次の 2 つの主要なタスクがあります。

  1. jquery.validate.js プラグインを初期化する
  2. マークアップの data-val* 属性を読み取り、これを jquery 検証ルールに変換します

読んだことがあるかもしれませんが、目立たないスクリプトが読み取るマークアップ属性は次のとおりです。

data-val="true"
data-val-rulename="message"
data-val-rulename-paramname1="paramvalue"
data-val-rulename-paramname2="paramvalue"

入力フィールドは次のようになります

  <input
     data-val="true" 
     data-val-required="This field is required..." 
     data-val-number="Please enter a number..."
     data-val-range="Must be between 50 and 100...",
     data-val-range-min="50"
     data-val-range-max="100"
     id="mynumber" 
     name="mynumber" 
     type="text" value="" />

目立たないスクリプトに対する私の個人的な意見は、Steve Sanderson がMVC の本で「デモウェア」と呼んでいるもののカテゴリに分類されるということです。それは箱から出してすぐにいくつかの優れた機能を実行しますが、それ自体で使用する方がはるかに簡単なjqueryの検証を妨げます。新しいプロジェクトを開始するときに削除する傾向があります。

于 2013-02-24T17:10:52.593 に答える