6

Nella mia applicazione sono presenti i seguenti tipi di URL.Rotta con due parametri opzionali in MVC3 non funzionante

localhost/admin/userdetail/id

localhost/admin/userdetail/id/vero

localhost/admin/userdetail/id/vero/successo

Ecco il mio controller Admin

bool inSaveAction, lo stato di stringa sono opzionali

[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 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 fare inSaveAction & status di parametro opzionale per la mia azione UserDetail?

risposta

9

Ti mancano i parametri nella configurazione del percorso. Al fine di rendere questo lavoro con diversi parametri opzionali (come nel post di Phil Haack), è necessario definire percorsi multipli

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) 

Avrete anche bisogno di imposta i parametri facoltativi come annullabili, altrimenti otterrai eccezioni se mancano id o inSaveAction.

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

} 
+0

Ho provato con il codice che dai. Anche questo non funziona. Non sta prendendo il metodo di azione. Qualche problema con i parametri del routing o del metodo di azione? –

+0

Ho appena pubblicato una modifica, è necessario rendere nullable id e inSaveAction. Ma cosa non funziona? Ho provato questo e tutti i percorsi funzionano. – mfanto

+0

Grazie. stato anche solo opzionale. –

1

È possibile utilizzare l'approccio introdotto here. 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() 

);

Problemi correlati