2011-04-19 43 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