6

Mam następujący typ adresu URL używany w mojej aplikacji.Trasa z dwoma opcjonalnymi parametrami w MVC3 nie działa

localhost/admin/userdetail/id

localhost/admin/userdetail/id/true

localhost/admin/userdetail/id/true/sukces

Oto mój Admin Controller

bool inSaveAction, status ciąg są opcjonalne

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

Poniżej przypadku nie działa

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

W Global.asax

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

Śledziłem http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

Jak mogę dokonać inSaveAction & status opcjonalnego parametru dla mojego działania UserDetail?

Odpowiedz

9

Brakuje parametrów w konfiguracji trasy. W celu dokonania tej pracy z różnymi parametrami opcjonalnymi (jak w poście Phil Haack jest), musisz zdefiniować wiele tras

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

a następnie utworzyć powiązania z:

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

będzie trzeba także ustaw opcjonalne parametry jako zerowalne, w przeciwnym razie dostaniesz wyjątki, jeśli id ​​lub inSaveAction są pominięte.

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

} 
+0

Próbowałem z podanym przez ciebie kodem. To też nie działa. Nie przechodzi do metody działania. Masz problem z routingiem lub działaniem metody działania? –

+0

Właśnie opublikowałem edycję, musisz podać identyfikator i inSaveAction nullable. Co jednak nie działa? Testowałem to i wszystkie trasy działają. – mfanto

+0

Dzięki. status również opcjonalny. –

1

Można zastosować podejście wprowadzone here. To pozwala zdefiniować jedną trasę taką jak ta

Powiązane problemy