2

これが重複している場合は、お知らせください。簡単に調べたところ、私の質問に本当に答えるものが見つからなかったからです。

私は ASP.NET MVC 2 を試しています。Web フォームのバックグラウンドから来て、実際にはHTTP GETHTTP POSTだけを扱いました。

GET/PUT/POST/DELETEをリポジトリのそれぞれのCRUD操作 (検索、挿入、更新、削除) に適用する方法を確認しようとしています。

次のアクションメソッドを持つ単一のコントローラーがあるとします。

[HttpGet] // GET: /Products/{id}
[ActionName("Products")
public ActionResult Get(int id = 0) { ... }

[HttpPut] // PUT: /Products
[ActionName("Products")
public ActionResult Put(Product product) { ... }

[HttpPost] // POST: /Products/{product}
[ActionName("Products")
public ActionResult Post(Product product) { ... }

[HttpDelete] // DELETE: /Products/{product}
[ActionName("Products")
public ActionResult Delete(Product product) { .. }

それに関するいくつかの質問 - アクションメソッドに名前を付けたり分離したりする方法はありますか? モデル全体 (製品) を通過する必要がありますか、それとも id のみを通過する必要がありますか?

私が抱えている問題は、ビューで関連する HTTP 動詞を使用してこれらのアクション メソッドを呼び出す方法がわからないことです。

この段階では、3 つのビューがあると考えています。

  1. インデックス」 - モデルにバインドしIEnumerable<Product>、「編集」、「詳細」、および「削除」リンクを使用してすべての製品を一覧表示します
  2. " SingleProduct " - "Update" ボタンを使用して、製品のすべての詳細を一覧表示する単一のモデルにバインドします。
  3. 新規Product」 - 「作成」ボタンを使用して、製品を作成するためのフォームを使用して、単一のモデルにバインドします。

だから - 私の質問は、特定のコントローラーメソッドを特定の HTTP 動詞で呼び出すように指定するにはどうすればよいですか?

では、列挙Html.BeginFormを指定できますが、FormMethodGET と POST しかありません。

  • PUT および DELETE コマンドを実行するにはどうすればよいですか?
  • HTTP動詞ごとに個別のビューが必要ですか?
  • 「削除」というリンクがある場合、コントローラーに対して HTTP DELETE コマンドを呼び出すことができますか、それともフォーム アクションの削除で新しいビューにリダイレクトする必要がありますか?

それとも、そもそもこれはばかげた/過剰な設計ですか?「GET」と「POST」に固執する必要がありますか?

私はこのスタイルの Web 開発 (REST) に (かなり) 慣れていないので、よろしくお願いします。:)

アップデート

そこで、まさにこのトピックに関する Stephen Walther の興味深い記事を見つけました。

彼は、HTML フォームが GET と POST のみをサポートしていることを示しています (私は REST スタイルの Web 開発に慣れていないため、これを知らなかったので、部分的に恥ずかしく思います)。

どうやら PUT/DELETE でコントローラー アクションを呼び出す唯一の方法は、AJAX を使用することです。真剣に?

では、ここで何をすべきか、GET/POST に固執する必要がありますか、それとも、基になる XmlHttpRequest コードを適切な関数の背後にラップする JavaScript ファイルを作成する必要がありますか?

ASP.NET MVC 開発者はどちらに傾いていますか? 確かに、誰かがこの同じ質問を自問したことがあります。

4

3 に答える 3

4

GET と POST に慣れ親しんでいる理由は、通常の古いブラウザーでは、特にフォームを送信するときに、URL の GET または POST しかできないためです。

コントローラーをこのように設定すると、少なくとも精神的には、REST API と Web サイトのどちらにも近いものを見ていることになります。

はい、AJAX リクエストのみがリクエスト メソッドを明示的に設定できるということは正しいので、AJAX を介して製品を削除するなどのアクションを実行する場合は問題ありません (この場合、ID のみを渡すことをお勧めします。製品全体をシリアル化するよりもはるかに軽く、マークアップ内の ID に簡単にアクセスできる可能性があります)。

つまりね。最新の Web アプリケーションを構築している場合は、おそらく AJAX を使用しており、あまり独断的にならずに、ユーザーが JavaScript を使用していることを期待する必要があります。AJAX を使用せずに CRUD を実行したい場合は、いつでも製品を POST するか、URL に ID を含む削除メソッドに GET を使用できます (注意してください。削除メソッドが認証の背後で保護されていることを確認してください。そうしないと、Web クローラーが喜んであなたのすべてのデータを取得して削除します...)

REST API を構築したくない場合は、DELETE を使用していない (URL の ID で GET を使用するだけ) または PUT を使用していない (製品で POST を使用するだけ) という事実を気にしないでください。 POST ボディのエンティティ)。

REST は、HTTP を介して API を構築するための優れたスタイルです (プレゼンテーション層なし、データを消費するクライアントに未加工の形式で送信されるデータ、電話や Web サイトなど)。HTTP は、Web ページを構築するのに優れています。必要なものには、必要なものを使用してください。

他の人とあなたの Web サイトの両方で使用される REST API を構築したい場合は、それを行い、サイトのコントローラー アクション メソッドが API メソッドを直接呼び出すようにします。私はいつもそうしています。Hammock のような Web クライアントを使用すると、作業が簡単になります。

于 2010-09-24T05:04:57.673 に答える
0

個人的には、AJAX を全面的に使用するのではなく、できるだけ単純な完全なリクエストに固執しています。私は ajax を使用していますが、それがエクスペリエンスを向上させる特定の場所で使用しています (そして、プログレッシブ JavaScript アプローチを使用しています)。

上記の理由から、私は常に GET と POST のみを使用しています。

ネーミングに関しては、Get、Update、Create、Delete のように、かなり明確にしています。実際には、操作の内容に関連するアクション名のようなものを使用しますが、単純なことについては問題なく機能します。

于 2010-09-24T06:15:21.937 に答える
0

HtmlHelper.HttpMethodOverride メソッド (System.Web.Mvc)

これはどう?

于 2010-09-24T09:13:57.473 に答える