3

公開されているコントローラーがあります(アクションはセキュリティ属性の下に隠すことはできません)。コントローラには、公開されているアクションもあります。

以下は、コントローラーのサンプル構造です。

 public SomeController : Controller {


       [HttpGet] 
       public ActionResult show(int id){

       }

 }

アクションには、必須のidフィールドがあります。ただし、誰かが必要のない不正な形式のURLを入力した場合id(または検索エンジンボットが必要なURLをヒットした場合id)に、不必要にログに追加されるエラーをスローします。

このソリューションに対処するための理想的なソリューションは何である必要がありますか。

私の頭に浮かぶ可能な解決策は次のとおりです。

  • idをNullable(int?id)として設定し、適切なエラーを示す他のページに呼び出し元をリダイレクトすることにより、値がない場合を明示的に処理します
  • 明示的に404エラーを送信します

これを行うために属性を使用する一般的な方法はありますか?

PS :(具体的には)明示的に言うと、コントローラーごとにそのようなケースを処理するための条件が他にある場合に書き込むことを意味します。

正しい方向へのヒントをいただければ幸いです。

4

2 に答える 2

3

ルート制約が必要です。これにより、ルーターはURLを後でではなく、早く(404になります)スローすることができます(パラメーターが欠落しているため、ルートは有効で、アクションに進み、アクションバーフになります)。

http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs

デフォルトルートの例(global.asax.cxの既存のルートを置き換える可能性があります):

// order is important; more specific routes to less specific routes is what you want
//
// default index action, with no ID
routes.MapRoute(
    "Default_Index",
    "{controller}/",
    new {controller="Home", action="Index"}
 );

// default create action, with no ID
routes.MapRoute(
    "Default_Create",
    "{controller}/Create",
    new {controller="Home", action="Create"}
 );

// default action requiring an ID (such as EDIT)
routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new {controller="Home", action="Index"},
    new {id = @"\d+" }
 );
于 2012-05-09T07:37:35.893 に答える
1

誰かが存在しないリソースを要求しているため、カスタムエラーページで404ステータスを返すことをお勧めします。

その要求を表す結果を返すことができる場合は、Nullable型として作成できます。それ以外の場合は、404ステータスを返します。

たとえば、アクションメソッドIndex(int? id)は、idがnullの場合、アイテムのリストを返すか、その特定のアイテムを返すことができます。ビジネスシナリオによって異なります。

于 2012-05-09T11:56:02.110 に答える