-1

同じページに 2 つのアクション メソッドがあります。1 つは初期ロードに GET を使用し、もう 1 つは別のページにリダイレクトする必要があるフォーム送信に POST を使用します。どちらの呼び出しでも、URL に 1 つの必須パラメータが必要であり、クエリ文字列から 2 つのオプション パラメータを取得することもできます。

オプションのパラメーターoPar1を呼び出してoPar2、GET メソッドのパラメーターとして取得されるものは、どのような組み合わせでも問題ありません。これらは、ページで使用される ViewModel に追加されます。

POST はアクション メソッドにパラメーターを提供する必要があるためaction、フォーム タグの属性には次のように記述します。

@Url.Action("PostAction", new { mPar = Model.mPar, oPar1 = Model.oPar1, oPar2 = Model.oPar2 })

言うまでもなく、メソッドも に設定されていpostます。

問題は、GET で 2 つのオプション パラメータのうち 1 つだけを指定したときに発生します。送信ボタンが押されると、POST ではなく GET メソッドが呼び出されるようです。オプションのパラメーターを両方指定するか、まったく指定しない場合、POST は正常に呼び出され、期待どおりにパラメーターが取得されます。

関数宣言は次のとおりです。

[HttpGet]
[RequireHttps]
public ActionResult GetAction(string mPar, string oPar1, string oPar2)

[HttpPost]
[RequireHttps]
public ActionResult PostAction(string mPar, MyModel model, string oPar1, string oPar2)

ルートは次のとおりです。

routes.MapRoute(
    "GetActionRoute",
    "mycontroller/{mPar}/pageName",
    new { controller = "myController", action = "GetAction", mPar = UrlParameter.Optional },
    new { httpMethod = new HttpMethodConstraint("GET") });

routes.MapRoute(
    "PostActionRoute",
    "mycontroller/{mPar}/pageName",
    new { controller = "myController", action = "PostAction", mPar = UrlParameter.Optional },
    new { httpMethod = new HttpMethodConstraint("POST") });

oPar2 をミックスに追加するまで、このセットアップが機能していたことを付け加えておく価値があります。私はここで本当にばかげたことをしていますか?

4

2 に答える 2

0

オプションのパラメーターを変更しないのに、なぜそれらを渡す必要があるのでしょうか?

これが絶対に必要な場合は、これら 2 つのプロパティ プロパティ (oPar1oPar2) をビュー モデルに追加し、非表示としてフォームに表示できます。

次に、POSTアクションでビューモデルをパラメーターとして使用します。

[HttpPost]
[RequireHttps]
public ActionResult PostAction(YourViewModel yourViewModel)

これを行うことで、リクエストにルートを追加する必要がなくなりPOSTます (既定の ASP.Net MVC ルートと一致するため)。

POSTリクエストに対してクリーンな URL と SEO に適した URL を維持するためにこれを行った場合、これらの URL は表示されず、送信から呼び出されform、デフォルト ルートを使用できることに注意してください。

于 2013-08-08T15:25:25.117 に答える
0

最終的に解決策を見つけましたが、質問に他の人が答えるのに十分な情報を提供していませんでした。申し訳ありません。

GET 中にページに渡される ViewModel は、Uri表す文字列ではなく、オブジェクトを使用していましたoPar1。action 属性は書かれたままだったので、POST に渡されるオブジェクトは ではUriなく でしたstring。当然のことながら、バインダーは を に自動的に変換していませんでしUristring。Uri オブジェクトの代わりに文字列を使用するようにモデルを変換すると、すべてがうまく機能するようになりました。

そうは言っても、POST の代わりに GET メソッドが呼び出されていたのは、まだ少し奇妙です。オプションのパラメーターの 1 つが間違った形式である場合、それは無視されると考えていたでしょう。他の誰かがこの動作を確認できるかどうか知りたいです。

コメントしてくれた他のみんなに感謝します。

于 2013-08-09T08:28:36.733 に答える