2012-12-03 89 views
1

這是我在ASP.NET MVC(MVC3)中的第一個項目,我在處理所有事情方面遇到了很多麻煩。根據選擇的語言,我的所有文字都將從數據庫中選擇。對於這種語言選擇,我更喜歡使用Session變量。我需要一個圖像鏈接到語言,所以我寫了下面幾行到.cshtml頁面。Asp.NET MVC3錯誤請求

@using (Html.BeginForm()) { 
    <a href='<%: Url.Action("Index", "Home", new { lang="Tr" }) %>'> 
     <img src="../../Content/Images/flag_tr.jpg" width="40" height="20" /> 
    </a> 
    <a href='<%: Url.Action("Index", "Home", new { lang = "En" }) %>'> 
     <img src="../../Content/Images/flag_en.jpg" width="40" height="20" /> 
    </a> 
} 

而在的HomeController

public ActionResult Index() 

     ViewBag.Message = "Welcome to ASP.NET MVC!"; 
     ViewBag.Selected = "Not yet selected"; 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(String lang) 
    { 
     if (lang == "Tr") 
     { 
      System.Web.HttpContext.Current.Session["Language"] = "Tr"; 
     } 
     else if (lang == "En") 
     { 
      System.Web.HttpContext.Current.Session["Language"] = "En"; 
     } 
     ViewBag.Selected = System.Web.HttpContext.Current.Session["Language"]; 
     return View(); 
    } 

當我點擊一個鏈接的標誌,我得到的 「HTTP錯誤400 - 錯誤的請求。」有人可以告訴我我做錯了什麼,或者我該怎麼做?

P.S .:我也試過沒有窗體,添加一個新的功能到控制器名爲並從那裏重定向到索引,但沒有成功。

回答

1

您似乎混合了Razor和WebForms語法。當您在頁上的「查看源文件」,我相信你不會看到你的錨正確的網址:

<a href='<%: Url.Action("Index", "Home", new { lang="Tr" }) %>'> 

應該是:

​​3210

另外,注意錨引起HTTPGET,即使是在一個表單中,所以您需要用JavaScript重寫它們的行爲,或者將您的lang檢查添加到控制器操作的HTTPGET版本中。嘗試這樣的事情,你的兩個控制器的動作組合成一個:

public ActionResult Index(string lang) 
{ 
    if (lang == "Tr") 
    { 
     System.Web.HttpContext.Current.Session["Language"] = "Tr"; 
    } 
    else if (lang == "En") 
    { 
     System.Web.HttpContext.Current.Session["Language"] = "En"; 
    } 

    ViewBag.Message = "Welcome to ASP.NET MVC!"; 
    ViewBag.Selected = System.Web.HttpContext.Current.Session["Language"] ?? "Not yet selected"; 
    return View(); 
} 

如果你不[HttpGet][HttpPost]裝飾這一點,那麼任何HTTP動詞將被映射到這個動作。

+0

非常感謝!關於HttpGet;我放置HttpGet而不是HttpPost,我可以得到Tr和Eng作爲輸出,但我現在沒有獲得原始的Index()功能。對不起,我缺乏知識我對C#很陌生,可以假設[HttpGet]是Java中的@Override形式嗎? –

+0

請參閱我的編輯控制器操作示例。我也會編輯你的問題的標題,因爲它與'Session'無關。 –

-1

如果我沒有錯,你的HomeController類名是HomeController

<a href='<%: Url.Action("Index", "HomeController", new { lang="Tr" }) %>'> 
    <img src="../../Content/Images/flag_tr.jpg" width="40" height="20" /> 
</a> 

所以,當你在指定的Url.Action控制器,它應該只是首頁,而不是的HomeController

所以你在視圖代碼就會像下面:

@using (Html.BeginForm()) { 
    <a href='<%: Url.Action("Index", "Home", new { lang="Tr" }) %>'> 
     <img src="../../Content/Images/flag_tr.jpg" width="40" height="20" /> 
    </a> 
    <a href='<%: Url.Action("Index", "Home", new { lang = "En" }) %>'> 
     <img src="../../Content/Images/flag_en.jpg" width="40" height="20" /> 
    </a> 
} 

讓我知道這對你的作品,或者你需要進一步澄清。由於

+1

謝謝,但我在回答前認可/編輯了這個問題。 –

+0

這甚至不是有效的Razor或WebForms語法,而是一種合併。 –

-1

相信該錯誤的原因可能URL,檢查本文由Scott Hanselman在 [http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx],它可能給你一個想法,使用特殊字符在URL 。

+3

我沒有在URL中放置任何「危險」字符,是嗎? –