5

次のルートを受け入れたい場合があります

 '/type/view/23' or '/type/view/hats'

ここで、23は帽子のIDです。

コントローラは次のようになります。

public class TypeController
{ 
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult View(int id)
    {
      ...
    }
}

今、彼らが23を通過した場合、問題はありません。彼らが帽子をかぶったら、私にはやるべきことがいくつかあります。この場合、IDとして渡された値がintであるか(データベースに存在するかどうかを確認する)、または文字列であるかどうかを確認するActionFilterを使用して、帽子を23に変換するのでしょうか。渡された文字列のIDが何であるかをデータベースで確認します。どちらの場合でも、一致するものが見つからない場合は、ユーザーを別のアクションにリダイレクトします。

第一に、私が正しいと名付けたアプローチです。第二に、ActionFilter内からリダイレクトを行うことが可能です。

乾杯アンソニー

4

2 に答える 2

4

文字列を受け入れるように署名を変更します。次に、idの値がintであるかどうかを確認します。そうである場合は、名前でルックアップしない場合は、IDでルックアップします。一致するものが見つからない場合は、リダイレクトを実行してください。

public class TypeController
{ 
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult View(string id)
    {
       Product product = null;
       int productID = -1;
       if (int.TryParse( id, out productID))
       {
           product = db.Products
                       .Where( p => p.ID == productID )
                       .SingleOrDefault();
       }
       else
       {
           product = db.Products
                       .Where( p => p.Name == id )
                       .SingleOrDefault();
       }

       if (product == null)
       {
           return RedirectToAction( "Error" );
       }
       ...
    }
}

これを行う理由は、適用するコントローラー/アクションを知るために、フレームワークが渡されたルートデータの署名と一致するものを探すためです。一致する署名がない場合--この場合は文字列を取ります--フィルタが呼び出される前に例外が発生します。残念ながら、文字列を受け取るものとintを受け取るものを使用できるとは思いません。その場合、フレームワークは、単一のパラメーターが渡された場合、少なくとも1つのパラメーターが渡された場合に、どちらが一致するかを判断できません。数、つまり。これを文字列パラメーターにし、翻訳を自分で処理することで、フレームワークがその作業を実行できるようになり、必要な動作が得られます。フィルターは必要ありません。

于 2009-06-30T02:25:53.180 に答える
0

あなたがこれを行うことができるかどうかわからない。文字列を渡して、それが数値かどうかを確認する必要があると思いますが、もっと良い方法があるかもしれません。

リダイレクト使用について

return RedirectToAction("MyProfile", "Profile");

RedirectToAction呼び出しの一部としてルート値を渡すことができるので、必要に応じてIDや名前などを渡すことができます。

ルートへのリダイレクトのような他のものもありますが、これもあなたが望むものに役立つかもしれません。

于 2009-06-30T02:18:09.217 に答える