2012-03-09 9 views
0

私の要件では、カスタムコントローラをマップすることができますが、1つのアクションしか呼び出すことができないというように、カスタムコントローラを組み込むことができます。だからではなく、この:MVC 3のデフォルト動作でMapRouteを有効にしませんか?

context.MapRoute(
    "RouteName", 
    "{controller}/{id}", 
    new { 
     controller = "MyCustomController", 
     action = "DefaultAction", <- I want to remove this. 
     id = UrlParameter.Optional 
    } 
); 

を、私はこれをしたい:

context.MapRoute(
    "RouteName", 
    "{controller}/{id}", 
    new { 
     controller = "MyCustomController", 
     id = UrlParameter.Optional 
    } 
); 

そしてそれはのデフォルト引数にそれを宣言指定しなくても...よくすることで、デフォルトの「DefaultController」と呼んで持っていますMapRoute。

助けが必要ですか?

+1

これを行う必要がある理由を説明できますか?私たちはよりよい選択肢を考案するかもしれません。 – jgauffin

答えて

3

これはできません。あなたのURLに{action}トークンが含まれていません。つまり、デフォルトの値で呼び出すアクションを絶対に指定する必要があります。

ルーティングエンジンの場所に座ってください。以下のリクエストが表示されます:Home/123。あなたは経路定義を見て、{controller}/{id}と表示されます。

偉大=>ここで、HomeControllerのインスタンスを作成できることがわかりましたが、アクションがデフォルト値として指定されていない場合は、それだけで十分です。このHomeControllerで呼び出すアクションがわからず、ここでストーリーが終了します。

あなたは彼のコードの問題について彼に知らせるために、開発者に次の例外をスロー:

RouteDataが非空の文字列値を「アクション」という名前の項目が含まれている必要があります。


UPDATE:

あなたは宣言の中でデフォルトのアクションを省略することができますが、それは裏でそれを追加するカスタム拡張メソッドを書くことができます:

public static class RouteExtensions 
{ 
    public static Route MyMapRoute(this RouteCollection routes, string name, string url, object defaults) 
    { 
     var defaultValues = new RouteValueDictionary(defaults); 
     if (!defaultValues.ContainsKey("action")) 
     { 
      defaultValues["action"] = "index"; 
     } 
     var route = new Route(url, new MvcRouteHandler()) 
     { 
      Defaults = defaultValues, 
      Constraints = new RouteValueDictionary(), 
      DataTokens = new RouteValueDictionary() 
     }; 
     routes.Add(name, route); 
     return route; 
    } 
} 

次に:

routes.MyMapRoute(
    "RouteName", 
    "{controller}/{id}", 
    new { controller = "MyCustomController", id = UrlParameter.Optional } 
); 
+0

MapRouteメソッドをオーバーライドまたは拡張する方法があるのか​​どうか疑問に思っていたので、デフォルトで渡すときにDefaultActionをバックグラウンドでタックすることができます。 – David

+0

@Davidもちろんこれも可能です。私は答えを更新して、あなたにどのように表示するのですか? –

+0

それは絶対にスポットです!ありがとうございます:) – David

関連する問題