2

私はMVCを初めて使用し、一般的な問題であると予想されるものを実装しようとしています。サイトの各ページに実装したい簡単な検索フォームがあります。このセクションで独自のコードを維持して、各ページでコードを複製する必要がないようにします。

これまでのところ、テンプレートページでレンダリングアクションを呼び出すことでこれを行うことができました。レンダリングアクションにより、クイック検索フォームにデータが入力されます。フォームを送信すると、フォームを検証できますが、検証情報を使用して同じページを再表示する方法が見つかりません。フォーム領域を更新するだけの方法が望ましいですが、ページが再表示される限り、完全なポストバックを受け入れます。

テンプレートレンダリング呼び出し

@{Html.RenderAction("Display", "QuickSearch");}

ActionController

    [HttpPost]
    public ActionResult Submit(QuickSearchModel qsModel)
    {
        if (!ModelState.IsValid)
        {
            return PartialView(qsModel);
        }

        //Perform redirect
    }

 [ChildActionOnly]
        public ActionResult Display()
        {
           //populate model
           return View(qsModel);
         }

クイック検索ビュー

<div>
    @using (Html.BeginForm("Submit", "QuickSearch"))
    { 
        @Html.ValidationSummary(true)
        @Html.LabelFor(m => m.Destination)@Html.EditorFor(m => m.Destination)@Html.ValidationMessageFor(m => m.Destination)<br />
        @Html.LabelFor(m => m.ArrivalDate)@Html.EditorFor(m => m.ArrivalDate)@Html.ValidationMessageFor(m => m.ArrivalDate)
        @Html.LabelFor(m => m.DepartureDate)@Html.EditorFor(m => m.DepartureDate)@Html.ValidationMessageFor(m => m.DepartureDate)<br />
        @Html.LabelFor(m => m.Adults)@Html.DropDownListFor(model => model.Adults, new SelectList(Model.AdultsSelectOptions, "value", "text", Model.Adults))<br />
        @Html.LabelFor(m => m.Children)@Html.DropDownListFor(model => model.Children, new SelectList(Model.ChildrenSelectOptions, "value", "text", Model.Children))<br />
        <input id="qsSubmit" name="qsSubmit" type="submit" value="Submit" />
    }
</div>

よろしくお願いします!

4

1 に答える 1

0

次のような問題があることがわかりました。

  1. 検索元のページにリダイレクトする方法は?
  2. この元のページが "POSTed to" だった場合、つまり、POST リクエストに基づいて何かをレンダリングしていた場合はどうなるでしょうか? この場合、この POST を簡単な方法で「再現」することはできません。
  3. 元のページにリダイレクトした後、検証に失敗した検索モデル (または単にエラー) を伝える方法は?

これらすべての課題を考えると、まず、この検索フォームを AJAX スタイルで作成することを真剣に検討します。それがあなたに合っていれば、それははるかに簡単な解決策になります。

AJAX がオプションでない場合、それぞれの質問に対する次の解決策が表示されます。

  1. 元のページの URL を使用して、検索フォームに隠しフィールドを作成します。検証が失敗した場合、この URL にリダイレクトできます (ローカル URL であり、誰も何かを阻止しようとしないことを確認するだけです)。
  2. これは大きな問題です。元の POST を再生しようとするのは簡単ではありませんが、必要ではないかもしれません。とにかくこれが問題かどうかを確認してください。
  3. TempData ディクショナリを使用して、エラーを伝えたり、モデルを元のページに戻したりできます。
于 2011-11-15T08:57:04.317 に答える