2016-10-10 8 views
1

私は&と読むことを覚えていますが、データを変更する可能性のあるコントローラーの操作には[httppost]しか使用しないでください(これらのソースは見つかりませんでした。データが変更されていない場合は、httpgetを使用していますか?

あなたが言いたいのは、データの検索だけを行う場合は、[httpget]を使用する必要があります。

私は2つのコントローラアクションを持っています - データを検索するためにのみ使用され、変更するためには使用されません。

私はASP.NET MVC 5コントローラ二つ[httpget]sこれを用いて試みた:しかし

public ActionResult MyAction(Guid Id) 
{ 
    // Id is used to populate the form 
} 

// I would previously have placed [httppost] here 
public ActionResult MyAction(MyObject myobj) 
{ 
    // myobj is posted back from the form - but no data is changed in the database, it's just a lookup 
} 

、私はこのエラーを取得する:

The current request for action 'MyAction' on controller type 'MyController' is ambiguous between the following action methods:

コンパイラが曖昧方法の問題点を有しています名前 - これを行うためのベストプラクティスは何ですか?

明示的に異なるアクションを指定するフォームを使用する必要がありますか。 (これは控えめで不気味だと思われます。その場合、[httppost]はよりシンプルに、よりエレガントに、より簡潔に見えます)。

データが保存されていない状況で[httpget]を使用する必要がありますか?

thx。

答えて

1

問題は、コントローラに同じ名前の2つのメソッドがあることです。そして、アクションリゾルバはどちらを使うかを決めることはできません。

最も簡単な方法は、属性を配置する必要はありません。この場合には、命名規則に従うことです:

public ActionResult GetMyAction(Guid Id) 
{ 
    // Id is used to populate the form 
} 

// I would previously have placed [httppost] here 
public ActionResult PostMyAction(MyObject myobj) 
{ 
    // myobj is posted back from the form - but no data is changed in the database, it's just a lookup 
} 

しかし、あなたの名前で滞在したい場合は、あなたが適切な属性を配置する必要があります。

[HttpGet] 
public ActionResult GetMyAction(Guid Id) 
{ 
    // Id is used to populate the form 
} 

// I would previously have placed [httppost] here 
[HttpPost] 
public ActionResult PostMyAction(MyObject myobj) 
{ 
    // myobj is posted back from the form - but no data is changed in the database, it's just a lookup 
} 
+0

こんにちは - あなたは私の意見が不足していると思います。私は、データが変更されていない場合は、フォームをポストしてはならないと思っていました。代わりにフォームを取得し、データが変更された場所のみをポストするはずです。 – niico

+0

いいえ、オブジェクト全体がポストバックされた場合、オブジェクトの一部が変更されているかどうかを確認するのはあなたの仕事です – Emil

+0

@niico 'データが変更された場所のみをポストする'この時点でサーバは何か変更があったかどうかを知りません。あなたができることは、クライアント(JavaScript)でチェックしてPOSTを防ぐことですが、これはまったく別のトピックです – Uriil

0

あなたは、vs投稿を得るための理論的根拠を誤解していると思います。重要なことは、ポストリクエストは常に状態を変更することではなく、重要なことはリクエストを取得することで決して状態を変更することではありません。 Webクローラーが管理ページを索引付けして、削除ハイパーリンク、http getを使用するすべて、またはブラウザーをランダムに追加または削除してショッピングカート項目を削除していたことを理解する前に、内容が不明瞭になることを定期的に経験したコンテンツ管理システムでした。

私はおそらくget動詞がサービスの動作をよりよく説明しているので、まだこれらの両方の動作を異なるものにしていますが、そうしないとよい理由があるかもしれません。

+0

はい、私は更新しないことに同意します。だからもっと冗長であっても、別のアクション名を指定した長いフォーム定義を使うだけでしょうか? – niico

関連する問題