3

MVC3アプリでは、次のビューがあります。

@using (Html.BeginForm("Index", "Search", new {query = @Request.QueryString["query"]}, FormMethod.Post))
{
   <input type="search" name="query" id="query" value="" />
}

URL「/Search?query = test」を入力すると、インデックスアクションのRequest.Querystringが検索値を完全に読み取ります(URLのアクションを無視するようにルートを設定しています)。シークボックスに入力すると、正しいアクションとコントローラーがヒットしますが(ルーティングは正常に見えます)、クエリ文字列は空のままです。私は何が間違っているのですか?

4

1 に答える 1

4

問題は、あなたがRequest.QueryStringコレクションを見ているということです。しかし、あなたはそうしているPOSTので、query値はRequest.Formコレクションにあります。しかし、私のサンプルのように、TextBoxにデータを入力してほしいと思います。

サンプル

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
   <input type="search" name="query" id="query" value="@Request.Form["query"]" />
}

しかし、これは実際のMVCアプローチではありません。そのためのViewModelを作成する必要があります。

モデル

namespace MyNameSpace.Models
{
    public class SearchViewModel
    {
        public string Query { get; set; }
    }
}

意見

@model MyNameSpace.Models.SearchViewModel

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
   @Html.TextBoxFor(x => x.Query)
   <input type="submit" />
}

コントローラ

public ActionResult Index()
{
    return View(new SearchViewModel());
}

[HttpPost]
public ActionResult Index(SearchViewModel model)
{
    // do your search
    return View(model);
}
于 2012-02-14T15:42:38.477 に答える