【发布时间】:2010-10-21 21:15:05
【问题描述】:
我想为HtmlHelper 类添加一个扩展方法,以便开发人员可以通用地检索AreaActionLink<T>,而不必每次都添加new { area = "MyArea" },也不必指定Controller。如果我指定命名空间或将区域控制器的命名空间放在 Web.config 中,这一切都很好。
例如,如果我将区域控制器命名空间更改为 My.Web.Controllers 而不是 My.Web.MyArea.Controllers,则会引发 404,但如果我使用命名空间,它会正确解析。
public static MvcHtmlString AreaActionLink<T>(this HtmlHelper helper, string linkText, string actionName, object routeValues, object htmlAttributes) where T : IController
{
RouteValueDictionary routes = new RouteValueDictionary(routeValues);
string area = typeof(T).GetArea();
if (!routes.ContainsKey("area"))
routes.Add("area", area);
return helper.ActionLink(linkText,
actionName,
typeof(T).Name.Replace("Controller", string.Empty),
routes,
htmlAttributes as Dictionary<string, object>);
}
如果在调用 AreaActionLink 时命名空间是完全限定的,则此方法有效
namespace My.Web.Areas.MyArea.Controllers
{
[Area("MyArea")]
public class OtherPlaceController : Controller
{
//...
}
}
并像这样调用:
<%=Html.AreaActionLink<OtherPlaceController>("Link Text", "MyAction")%>
但如果我尝试扁平化命名空间层次结构,这样我就不必为任何区域添加新命名空间,它会抛出 404。
namespace My.Web.Controllers
{
[Area("MyArea")]
public class OtherPlaceController : Controller
{
//...
}
}
似乎命名空间的.Areas 部分很重要,但我不知道为什么...
【问题讨论】:
标签: c# asp.net-mvc-2 asp.net-mvc-routing asp.net-mvc-areas