2012-09-25 27 views
1

我有一个名为News作为区域的模块。在NewsAreaRegistration我URL中的隐藏动作(mvc 4 web应用程序)

context.MapRoute(
      "NewsShow", 
      "News/{controller}/{friendlyUrlName}/{idNews}", 
      new { controller = "Show", action = "Index", friendlyUrlName = "", idNews = "" } 
     ); 

我认为(在主视图文件夹中)我用RouteUrl方法来执行我的自定义路线

@Url.RouteUrl("NewsShow", new { controller = "Show", action = "Index", friendlyUrlName = FriendlyURL.URLFriendly(true, Model.News.Data.ElementAt(0).Title), idNews = Model.News.Data.ElementAt(0).IdNews})" 

我希望做的是有这样的WWW的路线。 something.com/News/Show/bla-bla-bla/9 without action name在Show controller中有索引。我尝试了这个例子的所有排列,没有任何工作。这甚至有可能吗?

+0

只是想知道你为什么不使用@ Html.ActionLink – Tony

+0

监守我要强制执行?到哪个路线图 – TheMentor

+0

我试过了,我指定的只有控制器,只有动作,没有,没有任何工作...所以很奇怪,因为我在网上看到类似的问题,人们相当成功 – TheMentor

回答

2

好了,我想这一点....

路由表:(前默认)

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Hidden", 
      url: "News/{controller}/{friendlyUrlName}/{idNews}", 
      defaults: new {controller = "Home", action = "Index", friendlyUrlName = "", idNews = ""}); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Account", action = "Index", id = UrlParameter.Optional } 
     ); 

在查看:

@Url.RouteUrl("Hidden", new { friendlyUrlName = "Dude-Check-It-Out", idNews = 12 }) 
在我的控制器

public ActionResult Index(string friendlyUrlName, int idNews) 
     { 
      ViewBag.Message = "Modify this template to kick-start your ASP.NET MVC application."; 
      ViewBag.UrlName = friendlyUrlName; 
      ViewBag.NewsId = idNews; 
      return View(); 
     } 

我得到了这个..

/News/Home/Dude-Check-It-Out/12 

URL我去:

http://localhost:49840/News/Home/Dude-Check-It-Out/12 

我也改变了我对别的默认路由,以确保这不是使用默认路由。让我知道如果这有助于:)

+0

但是,如果你把断点放在索引动作中......当你点击url时它会进入吗? – TheMentor

+0

是的..我甚至显示在页面上的值。 – Tony

+0

更新了我的答案,以向我展示我的示例中的所有代码。 scrum会议时间不好回到少数,看看你是否明白了。 – Tony

1

您是否将此路线放在默认路线之前?路线位置是重要的,从上到下。

+0

我使用RouteUrl来避免这个问题 – TheMentor

+0

@TheMentor RouteUrl用于URL生成,在客户端它将是简单的链接 – webdeveloper

+0

是的,我想那样。我需要像www.something.com/News/Show/bla-bla-bla/9这样的链接,并且我想隐藏操作方法。这工作www.something.com/News/Show/Index/bla-bla-bla/9...这不www.something。com/News/Show/bla-bla-bla/9 – TheMentor

0

好吧......我设法以某种方式工作。

在我的NewsAreaRegistration中,我必须在默认情况下移动NewsShow路由。不知道为什么,因为RouteUrl应该兴奋地映射到NewsShow。

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
    "NewsShow", 
    "News/{controller}/{friendlyUrlName}/{idNews}", 
    new { controller = "Show", action = "Index", friendlyUrlName = "", idNews = "" } 
); 

    context.MapRoute(
    "News_default", 
    "News/{controller}/{action}/{id}", 
    new { action = "Index", id = UrlParameter.Optional } 
); 
} 

这是我现在RouteUrl(注意我不得不写controller.Not知道确切原因之一:

@Url.RouteUrl(
    "NewsShow", new { controller = "Show", friendlyUrlName = FriendlyURL.URLFriendly(true, Model.News.Data.ElementAt(0).Title), idNews = Model.News.Data.ElementAt(0).IdNews } 
); 
+1

嗯..我的回答和web开发人员的答案都是从你所说的话都是有效的..如果没有别的...... webdeveloper应该得到功劳,因为你正在描述他给的答案..虽然我确实给出了一个完整的例子..只是说..给予信用有助于激励人们提供更多帮助。 – Tony