5

tôi không thể nhận @Url.Action để giải quyết cho các url Tôi hy vọng dựa trên các tuyến đường thuộc tính tôi đã áp dụng:MVC Thuộc tính định tuyến với Url.Action không giải quyết đường

hành động của tôi (SearchController nhưng với [RoutePrefix ("thêm ")])

 [Route("{searchTerm}/page/{page?}", Name = "NamedSearch")] 
    [Route("~/add")] 
    public ActionResult Index(string searchTerm = "", int page = 1) 
    { 
     ... 
    } 

Gọi để Url.Action

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

Điều này dẫn đến một url của

/add?searchTerm=replaceMe&page=1

Tôi mong chờ

/add/replaceMe/page/1

Nếu tôi gõ url bằng tay sau đó nó quyết tâm hành động đúng với các thông số chính xác. Tại sao không @Url.Action giải quyết url chính xác?

Trả lời

11

Vì bạn có tên cho định nghĩa tuyến đường đẹp, bạn có thể sử dụng phương thức RouteUrl.

@Url.RouteUrl("NamedSearch", new { searchTerm = "replaceMe", page = 1}) 

Và vì bạn cần thêm url, bạn nên cập nhật định nghĩa tuyến đường của mình để bao gồm định dạng đó trong mẫu url.

[Route("~/add")] 
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
// to do : return something 
} 
+1

Cảm ơn, thêm tên cho cả hai tuyến đường và sử dụng RouteUrl là cách đáng tin cậy duy nhất để làm việc này cho cả hai tuyến đường. – Simon

+0

Đối với những người đến đây và muốn có một tuyến đường đến một hành động trong một ApiController: @ Url.HttpRouteUrl được lừa trong trường hợp này ;-) –

+0

Điều này đã giúp tôi vượt qua đúng tuyến đường đến PagedList Troy Goode. Đã bị đau đầu của tôi trong gần một ngày! – Shiva

3

Các tuyến đường có trật tự nhạy cảm. Tuy nhiên, các thuộc tính thì không. Trong thực tế, khi sử dụng 2 Route thuộc tính trên một hành động đơn lẻ như thế này, bạn có thể thấy rằng nó hoạt động trên một số biên dịch chứ không phải trên các biên dịch khác vì Phản ánh không đảm bảo thứ tự khi phân tích thuộc tính tùy chỉnh.

Để đảm bảo tuyến đường của bạn được nhập vào bảng lộ trình theo đúng thứ tự, bạn cần thêm thuộc tính Order vào từng thuộc tính.

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)] 
[Route("~/add", Order = 2)] 
public ActionResult Index(string searchTerm = "", int page = 1) 
{ 
    return View(); 
} 

Sau khi bạn khắc phục sự cố đặt hàng, URL sẽ giải quyết theo cách bạn mong đợi.

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 }) 

// Returns "/add/replaceMe/page/1" 
+0

Cảm ơn, tôi thấy rằng điều này đã cố định tuyến đường 'NamedSearch' nhưng đã phá vỡ tuyến đường cơ sở (thứ tự = 2) nếu tôi sử dụng @ Html.ActionLink ("Thêm vấn đề", "Chỉ mục", mới {controller = "Search"}). Cách đáng tin cậy duy nhất tôi có thể làm cho công việc này là thêm tên cho cả hai. – Simon

0

Để trở về đầy đủ sử dụng URL này

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme) 

// Returns "http://yourdomain.com/add/replaceMe/page/1" 

Hope this helps một ai đó.

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