私の ASP.NET MVC アプリケーションでは、次の概念を実装しようとしています。
- ブラウズ
http://.../PersonData/Show?id=A5668A31-9AAC-4A14-B471-7C9BA236961D
すると、指定された ID で識別される人物のデータが表示されます。 - ブラウジング
http://.../PersonData/Show
すると、テキスト ボックスに ID を入力できるフォームを含むビューが表示されます。フォームを送信すると、ブラウザは上記の URL に移動しますが、投稿はしません (つまり、フォームのメソッドが GET に設定されています)。 - ID を入力せずにフォームを送信すると (URLが参照
http://.../PersonData/Show?id=
される)、ASP.NET MVC モデルの検証で、ID が必要であるというメッセージが表示されます。(JavaScript が有効になっているかどうかに関係なく)。
これを実装するために、次のようなモデルを構築します。
class Model
{
[Required]
public Guid? Id { get; set; }
}
そして今http://.../PersonData/Show
、初めて閲覧するときに、ASP.NET モデルの検証ですぐに ID が必要であるというエラーが表示されるという問題があります。これは、フォームが ID なしで送信され?id=
た場合 ( ) と、アクションが初めて呼び出されました (id はまったく指定されていません)。
私が持っていたアイデア:
- 2 つの異なるコントローラー アクションと URL (
http://.../PersonData/Search
と などhttp://.../PersonData/Show?id=
) を使用して、最初の閲覧と空のフォーム送信を区別します。 - 追加のフォーム パラメータ (
http://.../PersonData/Show
や などhttp://.../PersonData/Show?valueGiven=true&id=
) を使用します。 Request
オブジェクトを使用してアクション メソッドから URL パラメーターを検査し、そのキーが URL に存在しないかどうかModelState
のエラーをクリアします。"id"
これを解決するための最良の/推奨される方法は何ですか? より良い4番目のアプローチはありますか?
(失敗したことの 1 つは、GET アクションに同じ名前の 2 つのアクション メソッドを追加することでした。
[HttpGet]
public void Show() { /* return view with initial browsing logic */ }
[HttpGet]
public void Show(Model model) { /* return view with subsequent browsing logic */ }
これは ASP.NET MVC では許可されていないようです。)
2013 年 6 月 25 日の更新:申し訳ありませんが、私のサンプルには 2 つの間違いがありました。ID はGuid
文字列ではなく である必要がありました。もちろん、Required
属性を評価する必要があるため、アクション メソッドでモデルをバインドしています。
そして、これは私のルーティング構成です:
public static void RegisterRoutes (RouteCollection routes)
{
routes.IgnoreRoute ("{resource}.axd/{*pathInfo}");
routes.MapRoute (
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
}