2010-02-26 27 views
14

我有一个建立在ASP.NET MVC2 RC2上的大型现有应用程序。如何在不为每个ActionLink添加area =“”的情况下指定默认Area

我所有的链接看起来像这样:// HTP网站/控制器/操作/ ID

我只是增加了称为区域:BigBird

现在,当我在BigBird面积是,我所有的环节是这样的:HTP://网站/ BigBird /控制器/操作/ ID

问题是,没有这些控制器/行动存在于我的新地区。所以我必须通过我的所有应用程序的所有动作链接,并把这个routevalue:area = string.empty

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

回答

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") %> 
+0

感谢您的回答。这正是我最终做的,但我没有回过头来发布它。 – iamwill 2010-03-09 18:53:42

+0

哈哈在这里,我加入了一个愚蠢的Html.AreaActionLink ...然后我看到了RouteValueDictionary GetRouteValuesFromExpression,并想知道这是什么ActionLinkAreaAttribute!谷歌它,并在这里降落在这里很好的工作:P – superlogical 2010-06-18 12:03:45

+0

嗨,但是当我们使用此区域属性 - [ActionLinkArea(“”)]并尝试使用Html.BuildUrlFromExpression (x => Index())时,我们仍然得到htp: // site/BigBird/controller/action/id area in URL ... – 2011-01-10 13:28:20

0

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

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

我的解释不是很清楚。 我将BigBird控制器/模型/视图添加到BigBird区域。但是同时包含Area和主站点的主页面在所有返回到主站点的链接中都显示了BigBird。因此,我需要做的是在所有的ActionLink调用中添加{Area =“”}。 从MVC源代码中我可以看出,它根据你所在的区域来推断区域。它并不确定控制器不在区域中,因此不正确地将BigBird添加到链接中, t在BigBird地区......他们根本不在任何Area。 – iamwill 2010-03-01 15:56:30