1

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

    private BreadCrumbItem breadCrumbItem;

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

    }

问题出在 Url.RouteUrl

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

感谢帮助

4

4 回答 4

5

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

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 ,之后它会在每次调用时返回您创建的项目。

于 2012-11-20T11:59:00.670 回答
3

您可以覆盖该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(...);
}
于 2017-05-10T18:12:31.923 回答
2

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

于 2012-11-20T12:04:49.780 回答
0

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

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 将为您提供每个参数的含义。
于 2012-11-23T12:34:49.047 回答