2011-06-13 16 views
0

私はMVCを初めて使いました。これはちょっと疑問の質問です。MVC 3ルーティングの質問

global.asaxでカスタムルートを設定しています。

routes.MapRoute(
    "Choose_your_dvd_Index", 
    "Choose-your-dvd", 
    new { controller = "DVD", action = "Index" } 
    ); 

routes.MapRoute(
    "Choose_your_dvd", 
    "Choose-your-dvd/{categoryName}", 
    new { controller = "DVD", action = "Category" } 
    ); 

具体的には、私は「選択 - あなたの-DVD」を私は次のビューの結果を持って、私のDVDコントローラ、 へ「を選択し、あなたを-DVD/{カテゴリ名を}」マッピングするだけでなく、デフォルトを持っていますページ。

public ViewResult Category(string categoryName) 
{ 
    var category = (db.Categories.Where(i => i.Name == categoryName).FirstOrDefault()) ?? null; 

    if (category != null) 
     return View(category); 

    return RedirectToRoute("Choose_your_dvd_Index"); 

    return View() ; 
} 

無効なカテゴリ名を入力した場合、ユーザーを「Choose-your-dvd」にリダイレクトしますか? (ブラウザのURLが変更されます)

ありがとうございます!

+0

よろしくお願いします。 ActionResultに変更されました。 (2番目の「返信表示()」を失った!) – mp3duck

+0

あなた自身の回答を追加する必要があります。 –

答えて

0

ViewResultの代わりにActionResultをリターンタイプとして使用する必要があります。リダイレクトすると表示されないため、コードに問題はありません。 RedirectToRouteメソッドはRedirectToRouteResultを返しますので、コードはコンパイルされません。それはそれは常に、すべてのコントローラのアクションメソッドのシグネチャは、基底クラスであるのActionResultを返すようにする最善の方法だ理由です:

public ActionResult Index() 
{ 
    return View(); 
} 

public ActionResult Category(string categoryName) 
{ 
    var category = (db.Categories.Where(i => i.Name == categoryName).FirstOrDefault()) ?? null; 
    if (category != null) 
    { 
     return View(category); 
    } 

    return RedirectToRoute("Choose_your_dvd_Index"); 
} 

ユーザー例/choose-your-dvd/foobarの要求とあれば、あなたの質問に示されているようあなたのルートが正確に見えると仮定すると、 foobarカテゴリがデータベースに存在しない場合、彼は同じコントローラのIndexアクションに正しくリダイレ​​クトされます。

+0

ありがとうダーリン:私が投稿した直後に見つけたもの: 他人を助けるために、上記のコードは、varカテゴリがカテゴリではなくboolなので、やや間違っていました!! – mp3duck