【问题标题】:How to specify default Area without adding area = "" to every ActionLink如何在不向每个 ActionLink 添加 area = "" 的情况下指定默认区域
【发布时间】:2011-01-21 15:56:42
【问题描述】:

我有一个基于 ASP.NET MVC2 RC2 构建的大型现有应用程序。

我所有的链接都是这样的:htp//site/controller/action/id

我刚刚添加了一个名为:BigBird 的区域。

现在,当我在 BigBird 区域时,我的所有链接都如下所示:htp://site/BigBird/controller/action/id

问题是我的新区域中不存在这些控制器/操作。所以我必须在我的应用程序中遍历所有的操作链接并放置这个路由值:area = string.empty

有没有办法解决这个问题?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-areas


    【解决方案1】:

    你可以做两件事之一。您可以将控制器/操作移动/复制到适当的区域,或者为新区域编写一些新控制器(这是我推荐的方法),或者您可以编写一个自定义路由,将新区域强制到根目录(我不推荐,因为它违背了拥有区域的全部目的):

    routes.MapRoute(
        "BigBird_Override",                                             
        "BigBird/{controller}/{action}/{id}",                          
        new { area = String.Empty }
    );
    

    【讨论】:

    • 我的解释不是很清楚。我将我的 BigBird 控制器/模型/视图添加到 BigBird 区域。但是涵盖该区域和主站点的母版页在返回主站点的所有链接中都显示了 BigBird。所以看起来我需要做的是将 {Area = ""} 添加到我所有的 ActionLink 调用中。从我在 MVC 源代码中可以看出,它根据您所在的区域推断区域。它不能确定控制器不在区域中,因此错误地将 BigBird 添加到不在的链接中BigBird 地区……他们根本不在任何地区。
    【解决方案2】:

    我不知道你是否使用标准的 MVC 方法(除了可能覆盖它们来调用你自己的版本),但如果你使用的是 ActionLink<TController> 或 MvcFutures 中提供的其他通用方法lib 然后就可以了。

    MvcFutures 方法调用ExpressionHelper.GetRouteValuesFromExpression(),它在控制器上查找ActionLinkAreaAttribute 以确定区域。所以你可以在你的主要“区域”中装饰你的控制器,如下所示:

    [ActionLinkArea("")]
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
    

    应使用标准语法正确生成操作链接:

    <%= Html.ActionLink<HomeController>(c => c.Index(), "Home") %>
    

    【讨论】:

    • 感谢您的回答。这正是我最终做的,但我没有回过头来发布它。
    • 哈哈在这里我添加了一个愚蠢的 Html.AreaActionLink ... 然后我看到了 RouteValueDictionary GetRouteValuesFromExpression 并想知道这个 ActionLinkAreaAttribute 是什么!谷歌它并登陆这里做得很好:P
    • 嗨,但是当我们使用这个区域属性 - [ActionLinkArea("")] 并尝试使用 Html.BuildUrlFromExpression(x=>Index()) 我们仍然得到 htp:// URL 中的 site/BigBird/controller/action/id 区域...
    • Html.BeginForm 是如何做到这一点的?
    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 2020-07-03
    • 2011-05-10
    • 2021-12-10
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多