6

私のアプリケーションには次の種類のURLがあります。MVC3の2つのオプションパラメータを使用してルートが動作しない

ローカルホスト/管理/ userdetail/ID

ローカルホスト/管理/ userdetail/ID /真

ローカルホスト/管理/ userdetail/ID /真/成功

ここ

ブールinSaveAction、文字列の状態ケースの下にオプションである

[Authorize] 
    public ActionResult UserDetail(string Id, bool inSaveAction, string status) 
    { 
    } 

    [HttpPost, Authorize, ValidateAntiForgeryToken] 
    public ActionResult SaveUserDetail(UserDetailViewModel viewModel) 
    { 
     User userToSave = new User(); 
     AdminService.UpdateUser(userToSave); 
     //This is calling the above function as it sending all 3 params 
     return RedirectToAction("UserDetail", new { Id = viewModel.Id, 
          inSaveAction = true, status = "success" }); 
    } 

を動作していない私の管理コントローラでありますGlobal.asaxの

routes.MapRoute("UserDetail", 
      "UserDetail/{id}", 
      new 
      { 
       controller = "Admin", 
       action = "UserDetail", 
       id = UrlParameter.Optional 
      } 
     ); 

@Html.ActionLink("DisplayName", "UserDetail", new { id = Model.Id }) 

私はどのように私は私のUserDetailアクションのためのオプションパラメータとしてinSaveAction &状態を作ることができますか?http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

を追いましたか

答えて

9

あなたのルート設定にパラメータがありません。

@Html.ActionLink("Link", "Index", "Admin", new { id = 1, inSaveAction = true, success = "success" }, null) 

ます。また、必要があるでしょうに:(フィル・ハークのポストのように)、オプションの異なるパラメータで、この作業をするためには、複数のルート

routes.MapRoute("UserDetail-WithStatus", 
       "UserDetail/{id}/{inSaveAction}/{status}", 
       new 
       { 
        controller = "Admin", 
        action = "UserDetail", 
        // nothing optional 
       } 
); 

routes.MapRoute("UserDetail-WithoutStatus", 
       "UserDetail/{id}/{inSaveAction}", 
       new 
       { 
        controller = "Admin", 
        action = "UserDetail", 
        // nothing optional 
       } 
); 

routes.MapRoute("UserDetail-WithoutSaveAction", 
       "UserDetail/{id}", 
       new 
       { 
        controller = "Admin", 
        action = "UserDetail", 
        id = UrlParameter.Optional 
       } 
); 

を定義し、とのリンクを作成する必要がありますオプションのパラメータをnullableに設定します。そうしないと、idまたはinSaveActionが見つからない場合に例外が発生します。

public ActionResult UserDetail(int? id, bool? inSaveAction, string status) 
{ 

} 
+0

私はあなたが与えたコードを試してみました。これも機能しません。それは行動方法に取っていません。ルーティングやアクションメソッドのパラメータに問題はありますか? –

+0

私はちょうど編集を投稿しました。あなたはidとinSaveActionをnullにする必要があります。何がうまくいかない?私はこれをテストし、すべてのルートが動作します。 – mfanto

+0

ありがとうございます。ステータスもオプションです。 –

1

導入されたアプローチhereを使用できます。このように1つのルートを定義できます。

routes.MapRoute(name: "UserDetail-WithStatus", 
      url: "UserDetail/{id}/{inSaveAction}/{status}", 
      defaults: new 
      { 
       controller = "Admin", 
       action = "UserDetail", 
       // nothing optional 
      }, 
      lookupParameters:new string[] { "id", "inSaveAction", "status" }, 
      routeValueService: new RouteValueService()