避免硬编码控制器和操作名称

kri*_*ian 12 c# model-view-controller asp.net-mvc asp.net-mvc-3

ASP.NET MVC似乎鼓励我使用硬编码字符串来引用控制器和操作.

例如,在控制器中:

return RedirectToAction("Index", "Home");
Run Code Online (Sandbox Code Playgroud)

或者,在一个视图中:

Html.RenderPartial("Index", "Home");
Run Code Online (Sandbox Code Playgroud)

我不想在我的代码中使用硬编码字符串.我该怎么做才能避免这种情况?

mcc*_*002 14

听起来像你想要使用强类型重定向.我创建了一个名为RedirectionHelper的静态助手类,它具有以下方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的是,您必须使用Nuget上提供的Microsoft.Web.Mvc期货库.

现在,对于您的控制器,创建一个所有控制器继承的基本控制器具有此方法:

protected RedirectResult RedirectToAction<T>(Expression<Action<T>> action, RouteValueDictionary values = null) where T : Controller
{
    return new RedirectResult(RedirectionHelper.GetUrl(action, Request.RequestContext, values));
}
Run Code Online (Sandbox Code Playgroud)

现在,在你的行动中,你所要做的就是说:

return RedirectToAction<Controller>(x => x.Index());
Run Code Online (Sandbox Code Playgroud)

同样,您可以编写一个html扩展方法,该方法接受相同的参数并构建您的锚标记.

就像上面所说的那样,当你更改Controller或Action名称时,你的项目将在编译时中断并显示中断发生的位置.但是,这只会出现在控制器中,看看视图是如何编译的.

希望这可以帮助!


Dol*_*lbz 5

查看T4MVC,它会生成类,因此您可以拥有强类型操作和控制器名称.由于它仍然只是字符串的映射,因此,如果更改控制器名称,则重构不会导致视图中的名称更新.

重新生成后,由于名称从生成的类中消失,您将收到编译错误,因此它仍然可用于重构并捕获使用硬编码字符串可能遗漏的问题.