Các đơn giản nhất cách sẽ được chỉ cần thêm tuyến đường khác mà không cần tham số userId
, vì vậy bạn có một dự phòng:
routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = @"\d+"});
routes.MapRoute("Profile", "profile",
new {controller = "Profile",
action = "Details"});
Theo như tôi biết, chỉ có cách khác mà bạn có thể làm được điều này sẽ với ràng buộc tùy chỉnh. Vì vậy, tuyến đường của bạn sẽ trở thành:
routes.MapRoute("ProfileDetails", "profile/{userId}",
new {controller = "Profile",
action = "Details",
userId = UrlParameter.Optional},
new {userId = new NullableConstraint());
Và mã hạn chế tùy chỉnh sẽ trông như thế này:
using System;
using System.Web;
using System.Web.Routing;
using System.Web.Mvc;
namespace YourNamespace
{
public class NullableConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.IncomingRequest && parameterName == "userId")
{
// If the userId param is empty (weird way of checking, I know)
if (values["userId"] == UrlParameter.Optional)
return true;
// If the userId param is an int
int id;
if (Int32.TryParse(values["userId"].ToString(), out id))
return true;
}
return false;
}
}
}
Tôi không biết rằng NullableConstraint
là tên tốt nhất ở đây, nhưng đó là tùy thuộc vào bạn!
Nguồn
2010-10-05 10:13:09
Tôi đã làm một cái gì đó tương tự như thế này, nhưng hơi chung chung hơn, với một nhà xây dựng có một biểu thức chính quy để phù hợp với giá trị được cung cấp. Cảm ơn! –
Tôi biết tôi đến muộn ở đây, nhưng không phải là dòng cuối cùng sẽ trở lại đúng không? Nếu không, ràng buộc luôn luôn thất bại nếu hướng tuyến là UrlGeneration. –
Nếu dòng cuối cùng trả về true thì * mọi thứ * sẽ khớp với ràng buộc ... nhưng có, bạn nói đúng, điều này không tính đến bất kỳ điều gì ngoài định tuyến yêu cầu đến. Nhìn vào nó bây giờ, tôi đã nghĩ rằng chúng ta chỉ có thể loại bỏ phần routeDirection của câu lệnh 'if' hoàn toàn; Tôi sẽ kiểm tra vào ngày mai và chỉnh sửa nếu đó là trường hợp. –