Percorso con due parametri opzionali in MVC3 non funzionanti

Ho i seguenti tipi di URL usati nella mia Applicazione.

localhost / admin / userdetail / id

localhost / admin / userdetail / id / true

localhost / admin / userdetail / id / vero / successo

Ecco il mio Admin Controller

bool inSaveAction, lo stato della stringa è facoltativo

[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" }); } 

Sotto il caso non funziona

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

In Global.asax

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

Ho seguito http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

Come posso rendere inSaveAction e lo stato come parametro opzionale per la mia azione UserDetail?

Ti mancano i parametri nella tua configurazione di percorso. Per rendere questo lavoro con parametri diversi opzionali (come nel post di Phil Haack), è necessario definire più percorsi

 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 } ); 

E quindi creare collegamenti con:

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

Dovrai anche impostare i parametri facoltativi come annullabili, altrimenti otterrai eccezioni se mancano id o inSaveAction.

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

Puoi usare l’approccio presentato qui . Ti permette di definire un percorso come questo

 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() 

);