пятница, 30 сентября 2011 г.

Cтрого типизированный аналог для UrlHelper.Action(string, string)

Пришло в голову написать строго типизированный аналог для UrlHelper.Action(string, string):
public static class MyMvcExtensions
{
  public static string Action<TController>(this UrlHelper urlHelper,
      Expression<Func<TControllerActionResult>> action)
    where TController : Controller
  {
    var controllerName = typeof (TController).Name;
    var actionName = GetActionName(action);
    return urlHelper.Action(actionNamecontrollerName);
  }

  private static string GetActionName<TController>(
      Expression<Func<TControllerActionResult>> action)
    where TController : Controller
  {
    var mce = action.Body as MethodCallExpression;
    if (mce == null)
    {
      throw new InvalidOperationException(action.Name + " is not a valid controller action");
    }
    return mce.Method.Name;
  }
}

Использовать так:
<a href="@(Url.Action<HomeController>(c => c.About()))">about</a>
<a href="@(Url.Action<HomeController>(c => c.Index()))">index</a>

Идея ясна, вроде, придумать дельше легко. Может кому и пригодится =)
В любом случае я советую сделать просто статический класс, расширающий UrlHelper и в котором хранить все-все ссылки в стандартном формате, которые используете в проекте, и обращаться только к нему.