【问题标题】:ASP.NET MVC Route URL in Controller Constructor控制器构造函数中的 ASP.NET MVC 路由 URL
【发布时间】:2012-11-20 11:53:22
【问题描述】:

尝试在控制器构造函数中生成 url 时遇到问题

    private BreadCrumbItem breadCrumbItem;

    public SummaryController()
    {
        this.breadCrumbItem = new BreadCrumbItem { Title = "Sommaire", Url = Url.RouteUrl(new { controller = "Summary", action = "Index" }) };

    }

问题出在 Url.RouteUrl

为什么我不能在控制器中访问它?有任何解决这个问题的方法吗 ? 因为否则我必须在此控制器的所有操作中添加相同的代码。

感谢您的帮助

【问题讨论】:

    标签: asp.net asp.net-mvc url-routing


    【解决方案1】:

    如果我理解你的问题,你想要这样的东西:

    public class SummaryController
    {
        public SummaryController()
        {
    
        }
    
        private BreadCrumbItem _breadCrumbItem = null;
    
        private BreadCrumbItem CrumbItem
        {
            get
            {
                 if(_breadCrumbItem == null)
                 {
                      _breadCrumbItem = new BreadCrumbItem { Title = "Sommaire", Url =        Url.RouteUrl(new { controller = "Summary", action = "Index" }) };
                 }
    
                 return _breadCrumbItem;
             }
        }
    }
    

    现在,在每种方法中,您都可以简单地使用 CrumbItem,它会在第一次创建新的 BreadCrumItem 时,然后在每次调用它时返回您创建的项目。

    【讨论】:

    • 非常好的主意,但我需要根据调用的操作执行不同的逻辑
    • 但是如果您需要在每个动作中更改参数,那么您需要在每个动作中调用或仅修改此数据。然后,您可以编写一个带有一些参数的方法并为您构建这个 BreadCrumItem。但因为这是一个非常小的代码和平,没有必要
    • CrumbItem 应该是一个属性吗?你错过了get 块。
    【解决方案2】:

    您可以覆盖Initialize() 方法。 Url 属性在基本控制器初始化后设置。

    protected override void Initialize(RequestContext requestContext)
    {
        // the controller's UrlHelper is still null
        base.Initialize(requestContext);
    
        // the controller's UrlHelper is now ready to use!
        var url = Url.RouteUrl(...);
    }
    

    【讨论】:

      【解决方案3】:

      您可以在控制器中访问它,但不能在构造函数中访问它。显然,在调用构造函数时未设置此值,因为它是在控制器生成器创建控制器之后填充的。使用@middelpat 解决方案延迟加载属性(在当前操作中首次使用时创建它)是解决问题的合理解决方案。此时,UrlHelper 实例应该在控制器中可用。

      【讨论】:

      • 感谢您的回答,任何有关 ASP.NET MVC 页面生命周期的文档都将得到重视。
      • @riadh_vmc stackoverflow.com/questions/460145/… 此外,除非您自己设置实例属性,否则不会在构造函数中设置实例属性,这只是常识。 MVC 并不神奇,即使框架必须调用类构造函数才能设置任何实例属性。
      【解决方案4】:

      我认为你需要这样的答案:

      https://stackoverflow.com/a/700357/637425

      引用:

      如果您只想获取某个操作的路径,请使用 UrlHelper:
      UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
      string url = u.Action("About", "Home", null); 
      如果你想创建一个 超链接:
      string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext,
      System.Web.Routing.RouteTable.Routes, "My link", "Root", "About",
      "Home", null, null);  
      Intellisense 会给你每一个的含义 参数。

      【讨论】:

      • this.ControllerContext 在控制器的构造函数中也是null
      • @djs 然后使用HttpContext.Current.Request.RequestContext 访问请求上下文
      猜你喜欢
      • 2011-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多