OnR*_*lve 2 asp.net-mvc controller asp.net-mvc-routing
我的目标是从它的名称和区域中找到一个控制器.如果我的当前httpContext区域与待定控制器位于同一区域内,我已成功完成此操作.但是,我无法接受ControllerFactory考虑区域的呼吁.这是我的代码:
public static ControllerBase GetControllerByName(this HtmlHelper htmlHelper, string controllerName)
{
IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
IController controller = factory.CreateController(htmlHelper.ViewContext.RequestContext, controllerName);
if (controller == null)
{
throw new InvalidOperationException(String.Format(CultureInfo.CurrentCulture, "The IControllerFactory '{0}' did not return a controller for the name '{1}'.", factory.GetType(), controllerName));
}
return (ControllerBase)controller;
}
Run Code Online (Sandbox Code Playgroud)
因为它RequestContext是一个参数,我为它添加了一个"区域"的路由值,但没有变化.我可以用requestContext做些什么来考虑区域吗?我是否需要覆盖控制器工厂 - 如果是这样,特别是处理区域区别的是什么?
更新:
以下是我所拥有的AreaRegistration示例:
public class StoresAreaRegistration : AreaRegistration
{
public override string AreaName { get { return "Stores"; } }
public override void RegisterArea(AreaRegistrationContext context)
{
context.MapRoute(
AreaName,
AreaName + "/{controller}/{action}/{id}",
new { area = AreaName, controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
用于定位控制器的区域和命名空间位于RequestContext的RouteData中.默认情况下,它们是基于您当前正在提供的请求而普及的,如果您需要更改它们,则必须在调用CreateController之前执行此操作.当找不到控制器时,您可能会遇到异常,因此您也必须考虑到这一点.
更新:注意,您必须创建一个新的RequestContext.如果您重复使用现有的那个,那么稍后会在此请求的行中解决操作和视图的问题.
var tempRequestContext = new RequestContext(Request.RequestContext.HttpContext, new RouteData());
tempRequestContext.RouteData.DataTokens["Area"] = "";
tempRequestContext.RouteData.DataTokens["Namespaces"] = "YourCompany.Controllers";
var controller = ControllerBuilder.Current.GetControllerFactory()
.CreateController(tempRequestContext, "ControllerName");
if(controller != null)
{
//TODO: Implement your logic here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4070 次 |
| 最近记录: |