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名称时,你的项目将在编译时中断并显示中断发生的位置.但是,这只会出现在控制器中,看看视图是如何编译的.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
2990 次 |
| 最近记录: |