Nghe có vẻ như tôi muốn sử dụng chuyển hướng được nhập mạnh mẽ. Tôi đã thực hiện một lớp helper tĩnh gọi RedirectionHelper có phương pháp sau:
public static string GetUrl<T>(Expression<Action<T>> action, RequestContext requestContext, RouteValueDictionary values = null) where T : Controller
{
UrlHelper urlHelper = new UrlHelper(requestContext);
RouteValueDictionary routeValues = ExpressionHelper.GetRouteValuesFromExpression(action);
if (values != null)
foreach (var value in values)
routeValues.Add(value.Key, value.Value);
return urlHelper.RouteUrl(routeValues);
}
Thông báo trước là bạn sẽ phải sử dụng Microsoft.Web.Mvc thư viện tương lai có sẵn trên NuGet.
Bây giờ, đối với điều khiển của bạn, tạo ra một bộ điều khiển cơ sở rằng tất cả các bộ điều khiển thừa hưởng từ đó có phương pháp này:
protected RedirectResult RedirectToAction<T>(Expression<Action<T>> action, RouteValueDictionary values = null) where T : Controller
{
return new RedirectResult(RedirectionHelper.GetUrl(action, Request.RequestContext, values));
}
Bây giờ, trong hành động của bạn, tất cả các bạn phải làm là nói:
return RedirectToAction<Controller>(x => x.Index());
Tương tự, bạn có thể viết một phương thức mở rộng html có cùng tham số và xây dựng thẻ neo của bạn.
Giống như bạn đã nói ở trên mà bạn muốn, khi bạn thay đổi tên Bộ điều khiển hoặc Hành động, dự án của bạn sẽ bị ngắt tại thời gian biên dịch và cho bạn thấy nơi xảy ra vi phạm. Tuy nhiên, điều này sẽ chỉ xảy ra trong các bộ điều khiển, xem như cách các khung nhìn không biên dịch.
Hy vọng điều này sẽ hữu ích!
Không có vấn đề với IMHO này. Tại một số điểm bạn phải nói cho mã để trỏ đến một lớp hoặc chức năng cụ thể. – Timbo
@Badger vấn đề là những gì nếu bạn đổi tên hành động/bộ điều khiển của bạn. Sau đó bạn phải bằng cách nào đó tìm thấy tất cả các chuỗi mã hóa cứng để cập nhật chúng và bạn không thể dựa vào trình biên dịch để cho bạn biết rằng bạn đã bỏ lỡ một cái gì đó. – Dolbz
ReSharper có thể làm cho điều này không thành vấn đề – driushkin