如何指定默认区域而不向每个ActionLink添加区域=“”

时间:2010-02-26 22:31:31

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

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

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

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

现在,当我在BigBird区域时,我的所有链接都是这样的:htp:// site / BigBird / controller / action / id

问题是我的新区域中没有这些控制器/操作。所以我必须遍历我的应用程序中的所有actionlinks并将此routevalue:area = string.empty

有什么方法吗?

2 个答案:

答案 0 :(得分:12)

如果你使用标准的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") %>

答案 1 :(得分:0)

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

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