在净MVC中,你如何行动的外部访问的URL路径变量?

我建设,其他控制器可以继承(提供跨网站的基本功能,而不必重复代码)控制器:

public abstract class ApplicationController : Controller { protected ApplicationController() { //site logic goes here //what is the value of agentID from the Action below?? } } public class AgentController : ApplicationController { public ActionResult Index(string agentID) { return View(); } }

适用于整个网站的逻辑将进入的ApplicationController类的构造函数。

问题是在该构造我需要从动作访问该值在参数,在这种情况下的agentId(这将是在整个网站的相同)。 有没有办法读取该值?

--------------解决方案-------------

构造后的动作发生。 不存在的值(没有被绑定)的一个构造。 路线数据可能在构造函数中已知的,但动作数据结合肯定不会发生呢。 不能得到这个值肯定,直到动作被调用。

路由数据可以通过控制器内部进行访问:

ControllerContext.RouteData.Values

然而,它是不正确的假设,AGENTID只能被绑定到的路径数据。 事实上,它可能来自一个服务器变量,表单字段,查询字符串参数,等等。我的建议是,明确地传递任何需要的地方。 如果不出意外,它使你的单元测试更好。

还有就是,虽然你需要覆盖ControllerFactory 在您RegisterRoutes中的global.asax.cs方法,加入这一行:

public static void RegisterRoutes(RouteCollection routes) {
// Route code goes here
ControllerBuilder.Current.SetControllerFactory(typeof(MyControllerFactory));
}

然后定义MyControllerFactory

public class MyControllerFactory : DefaultControllerFactory {
public override IController CreateController(RequestContext requestContext, string controllerName) {
// poke around the requestContext object here
return base.CreateController(requestContext, controllerName);
}
}

requestContext对象有所有的路由数据和价值观吧。 你可以用它来传递任何你想你的控制器的构造函数。

编辑补充说,这是大多数流行的依赖喷油器(例如,StructureMap)工作过。

我想通了,怎么办呢?很相似,克雷格斯顿茨的回答,但不同的是你如何到达的RouteData。

使用ControllerContext.RouteData.Values​​不会在用这样的方式(它不会从原来的控制器,而不是从一个基地一个像我建)一个普通的方法工作,但我没有到达的RouteData通过覆盖OnActionExecuting方法:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
string agentID = filterContext.RouteData.Values["agentID"].ToString();
OtherMethodCall(agentID);
}

分类:C# 时间:2015-03-15 人气:0
本文关键词: C#,asp.net的MVC
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.370 (s). 10 q(s)