2011-04-19 75 views
2

我正在使用一个标准的MVC 3 Web项目,我写了我的HTML在一个标准的HTML文件,然后复制/粘贴到_layout.cshtml文件。通过包含所有正确的RenderBody()和@ Html.Partial(“_ LogOnPartial”),页面可以正常工作,但_LogOnPartial中的ActionLink不会呈现href。LogOnPartial呈现与空白href - MVC 3

Html.ActionLink("Log On", "LogOn", "Account") 

会出来为:

<a href="">Log On</a> 

这是你得到的标准链接不变,当你启动一个MVC 3 Web项目。

注册的航线有:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Products", 
      "{controller}/{action}/{id}", 
      new {controller = "Products", action = "Index"}); 

     routes.MapRoute(
     "Newsletter", 
     "{controller}/{action}/{emailAddress}", 
     new { controller = "Newsletter", action = "Index" }); 

     routes.MapRoute(
     "Account", 
     "{controller}/{action}/{id}", 
     new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }); 

    } 

我不明白为什么会这样,但在Visual Studio它不强调这让我觉得这是不正常看到的AccountController行动或控制器。任何人有任何想法?

+0

只是为了排除显而易见的问题,您在'AccountController'中确实有一个'LogOn'动作,不是吗? – 2011-04-19 14:07:45

+0

是的,我愿意。这是作为默认软件包的一部分。事实上,有一个LogOn和一个LogOn(HttpPost)以及一个LogOn.cshtml。 – John 2011-04-19 14:18:33

回答

0

的Fabian是正确的。问题是因为路线太多,其中许多路线在模式上几乎完全相同。您的“默认”,“产品”和“帐户”路线都会查找控制器,操作和可选ID(显式或隐式)。你可能会有相当多的成功,如果你刚才设置的默认控制器恢复为出厂标准形式,像这样:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new 
      { 
       controller = "Home", 
       action = "Index", 
       id = UrlParameter.Optional 
      }); // Parameter defaults 


     routes.MapRoute(
     "Newsletter", 
     "{controller}/{action}/{emailAddress}", 
     new { controller = "Newsletter", action = "Index" }); 

    } 

由于ID是可选的,你的产品路线仍将匹配,如果你提供与ActionLink的没有ID(例如@Html.ActionLink("My Link", "Products", "Index")),“帐户”路线的形式与“默认”路线完全相同。没有必要使用它,并且MVC可能会在这些之间被绊倒,这会导致LogOn部分的Href失败。

0

ActionLink不会看控制器或它的动作,只是路由表。确保你有一个在你的global.asax中设置了“LogOn”和控制器“Account”操作的路由。

编辑:
我建议你读一下mvc路由。你目前的路线太贪婪,并且会在不应该时匹配。

用于登录我会用这样的事情(把它放在因为它是最贪婪的,因为它不包含任何变量的顶部):

routes.MapRoute(
     "Account", 
     "logon", 
     new { controller = "Account", action = "LogOn", id = UrlParameter.Optional }); 
+0

我在Global.asax.cs中设置了以下内容:'routes.MapRoute( “Account”, “{controller}/{action}/{id}”, new {controller =“Account”,action =“LogOn”,id = UrlParameter.Optional});'但它仍然呈现'href =“/”'。当我将其更改为Html.ActionLink(“登录”,“关于”,“主页”)时,它会呈现'href =“/ Home/About /”'。 – John 2011-04-20 18:39:58

+0

请使用整个RegisterRoutes方法更新您的问题。 – Fabian 2011-04-20 19:10:34