1

コントローラ:

// other usings are removed for the sake of brevity
using MvcMovie.Models;

namespace MvcMovie.Controllers
{
    public class MoviesController : Controller
    {
        private MoviewDBContext db = new MoviewDBContext();

        public ActionResult SearchIndex(string searchString)
        {
            var movies = db.Movies.Select(x => x);
            if (!string.IsNullOrEmpty(searchString))
                movies = movies.Where(x => x.Title.Contains(searchString));

            return View(movies);
        }

    }
}

意見:

// SearhcIndex.cshtml

@model IEnumerable<MvcMovie.Models.Movie>

@using (Html.BeginForm())
{
    <p>
        Title: @Html.TextBox("searchString")
        <br />
        <input type="submit" value="Filter" />
    </p>
}

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Title)
        </th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.Title)
            </td>
        </tr>
    }

</table>

に初めてアクセスするlocalhost/Movies/SearchIndexと、HttpGet SearchIndexが呼び出され、対応するビューのモデルが読み込まれます。ビューがブラウザにレンダリングされたら、単語を入力してリストを除外し、送信ボタンを押しますFilter

私の質問は:

をクリックするFilterと、私の意見では、フォームが POST 動詞で送信されます。しかし、なぜget が再びHttpGet SearchIndex呼び出されるのでしょうか? 私はまだ実装していません(確かに)。HttpPost SearchIndex

注:私は初心者です。学ぶことができる理由を示さずに反対票を投じないでください。このチュートリアル「編集メソッドと編集ビューの調査」を読んでいます。

4

3 に答える 3

5

これは、get リクエストのみを処理するように指定していないためです。デフォルトでは、両方を処理します。属性を追加すると、HttpGet期待どおりの動作が得られます

    [HttpGet]
    public ActionResult SearchIndex(string searchString)
    {
        var movies = db.Movies.Select(x => x);
        if (!string.IsNullOrEmpty(searchString))
            movies = movies.Where(x => x.Title.Contains(searchString));

        return View(movies);
    }

    [HttpPost]
    public ActionResult SearchIndex(string searchString, string someOtherParam)
    {
        var movies = db.Movies.Select(x => x);
        if (!string.IsNullOrEmpty(searchString))
            movies = movies.Where(x => x.Title.Contains(searchString));
        //do something different than your get...
        return View(movies);
    }

Post を処理するための別の方法をここに含めたことに注意してください。コメントで述べたように、これでも失敗する場合は、フォームで POST を明示的に指定しますが、これを機能させるためにそれを行う必要はありませんでした。

また、post メソッドには別の名前が必要になるか、get とは別のパラメーターが必要になることに注意してください (.net がそれらを区別できるようにするため)。

あなたが初心者であると述べたので、ここに私が好むMVCチュートリアルがあり、MVCを開始するときに新しい開発者に読んでもらいます: http://www.asp.net/mvc/tutorials/mvc-music-store

まだ行っていない場合は、ぜひチェックしてください。

更新

あなたのコメントに基づいて、あなたが提供したリンクで彼らがあなたに言っていることは次のとおりです。リクエストがコントローラーにルーティングされると、MVC はリクエストに正確に一致する最初のアクション メソッドを選択します。適用しない場合[HttpGet]、または[HttpPost]そのアクション メソッドは両方を受け入れます。/mysite/Movies/SearchIndex を参照するとします。上記の私の例を使用すると、これは GET 要求であるため、MVC は [HttpGet] でマークされた SearchIndex を持っていることを認識し、それを使用します。

ここで、 を削除し、もう一方は[HttpGet]そのまま[HttpPost]にしておきます (提供した記事の例のように)。/mysite/Movies/SearchIndex を参照すると、MVC は SearchIndex() が HTTPPost でマークされていることを確認し、「それは使用できません!」と表示します。次に、属性のない SearchIndex() を確認し (Post と Get の両方を受け入れることを意味します)、それを使用します。

同様に、POST リクエストで /mysite/Movies/SearchIndex を発生させると、MVC は SearchIndex() が でマークされて[HttpPost]いることを認識し、完全一致としてそれを使用します。

この記事がうまく伝わらない点は、メソッドのデフォルトの動作が GET と POST の両方を受け入れることであるということです。その時点で記事が実際に言っていることは、その特定のシナリオが与えられ、一方がマークされ[HttpPost]、もう一方がまったくマークされていない場合、デフォルトの動作により、マークされていないアクション メソッドが使用されます。

これが紛らわしい場合は申し訳ありません。これを数回書き直しましたが、説明が少し複雑です。

于 2013-06-19T14:37:48.383 に答える
0

フォームは POST メソッドを使用して送信されます。そして、POST 動詞を使用して SearchIndex アクションに送信されます。それを確認するには、SearchIndex アクションを HttpGet 属性で装飾してください。

[HttpGet]
public ActionResult SearchIndex(string searchString)
    {
        var movies = db.Movies.Select(x => x);
        if (!string.IsNullOrEmpty(searchString))
            movies = movies.Where(x => x.Title.Contains(searchString));

        return View(movies);
    }

動詞フィルターを追加した後、それに POST しようとするとエラーが発生します。

于 2013-06-19T14:40:31.500 に答える