6

Tôi có một loại url sau được sử dụng trong Ứng dụng của tôi.Tuyến với hai tham số tùy chọn trong MVC3 không hoạt động

localhost/admin/userdetail/id

localhost/admin/userdetail/id/đúng

localhost/admin/userdetail/id/đúng/thành công

Đây là điều khiển quản trị của tôi

bool inSaveAction, tình trạng chuỗi là không bắt buộc

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

Dưới đây trường hợp không được làm việc

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

Trong Global.asax

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

Tôi đi theo http://haacked.com/archive/2011/02/20/routing-regression-with-two-consecutive-optional-url-parameters.aspx

Làm thế nào tôi có thể làm tình trạng inSaveAction & như tham số tùy chọn cho hành động UserDetail của tôi?

Trả lời

9

Bạn đang thiếu các tham số trong cấu hình tuyến đường của mình. Để thực hiện công việc này với các thông số khác nhau tùy chọn (như trong bài Phil Haack của), bạn cần phải xác định nhiều tuyến đường

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

Và sau đó tạo ra mối liên hệ với:

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

Bạn cũng sẽ cần phải thiết lập các tham số tùy chọn là nullable, nếu không bạn sẽ nhận được các ngoại lệ nếu id hoặc inSaveAction bị thiếu.

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

} 
+0

Tôi đã thử với mã bạn cung cấp. Điều này cũng không hoạt động. Nó không tham gia vào phương thức hành động. Bất kỳ vấn đề trong định tuyến hoặc phương pháp hành động params? –

+0

Tôi vừa mới đăng bản chỉnh sửa, bạn cần phải đặt id và inSaveAction có thể vô hiệu hóa. Điều gì không hoạt động? Tôi đã thử nghiệm điều này và tất cả các tuyến đường đều hoạt động. – mfanto

+0

Cảm ơn. trạng thái cũng chỉ tùy chọn. –

1

Bạn có thể sử dụng cách tiếp cận được giới thiệu here. Nó cho phép bạn xác định một tuyến đường như thế này

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

);

Các vấn đề liên quan