2017-08-08 38 views
0

我在控制器中有一個操作方法,而在不同的語言中有兩個視圖。在asp.net中的控制器中重定向後,查看內容無法正確顯示mvc

public ActionResult Index(Guid id, string languageName) 
    { 
     var view = "Welcome_en"; 
     if (languageName == "Spanish") 
      view = "Welcome_es"; 
     return View(view, model); 
    } 

默認languageName是 「英語」。(在默認RouteConfig.cs部分)。所以在開始時,頁面被加載在http://localhost:12091/Some/sssf6bda-9r5e-64d7-9bd2-63c2te616adb

我看到的視圖是Welcome_en.cshtml。在這個視圖中,我有一個語言下拉菜單來切換活動語言。我選擇西班牙語,然後進行ajax調用。

$("#Languages").change(function() { 
      var activeLanguage= $(this).find('option:selected').val(); 
       $.ajax({ 
         url: "/Some/Index", 
         datatype: "text", 
       data: { id: '@Model.Guid', languageName: activeLanguage }, 
       type: "POST", 
       success: function() { 
        console.log('Success') 
       } 
       }) 

然後我看到代碼再次進入控制器。要顯示的視圖應該是Welcome_es.cshtml。

1

視圖Welcome_es.cshtml基本上是相同Welcome_en.cshtml。不同之處在於不同語言的內容。我在Welcome_es.cshtml中設置了斷點,它確實達到了。但是最終的顯示結果仍然與Welcome_en.cshtml相同。

我不確定它爲什麼顯示英文視圖的內容,我清理了這些cookie,但它是一樣的。另外,我在英文頁面設置了一個斷點,當語言是「西班牙語」時,它不會去那裏。

+0

輸入控制器動作時,languageName的值是多少?在languageName參數上做一個手錶 –

回答

0

您當前的代碼正在進行ajax調用,但是未使用來自該調用的響應

您應該返回部分視圖結果並使用它來更新DOM的相關部分以查看更改。你可以做的是,在Ajax調用

$.ajax({ 
    url: "/Some/Index", 
    data: { id: '@Model.Guid', languageName: activeLanguage }, 
    type: "POST", 
    success: function(response) { 
     $("#someDiv").html(response); 
    } 
}); 

的成功事件假設你有一個出現在你的頁面ID someDiv一個div,上面的代碼將更新與響應該元素的內部HTML從你的Ajax到來調用,這是相應的視圖(基於您從客戶端傳遞的語言名稱)生成的html標記

我還注意到您正在爲普通頁面加載和ajax調用調用相同的操作方法。在那種情況下,你想用ajax調用來實現什麼?你可以簡單地重新加載頁面。不需要阿賈克斯。

$(function() { 

    $("#Languages").change(function() { 
     var activeLanguage = $(this).val(); 
     window.location.href = "@Url.Action("index","Home")?languageName=" 
            + activeLanguage +"&[email protected]()"; 
    }); 

}); 

如果您正在使用頁面重新加載,您可能希望通過上一頁中的選擇選擇下拉菜單。您可以使用Html.DropDownListFor幫助器和頁面的視圖模型來解決此問題。

將新屬性添加到您的視圖模型中以存儲所選語言。

public class YourPageViewModel 
{ 
    // Your other existing properties goes here 

    public string SelectedLanguage { set;get;} 
} 

現在在您的GET操作方法中,您應該根據您的方法參數設置SelectedLanguage屬性值。

public ActionResult Index(Guid id, string languageName) 
{ 
    var view = "Welcome_en"; 
    if (languageName == "Spanish") 
     view = "Welcome_es"; 

    var model = new YourPageViewModel(); 
    model.SelectedLanguage = languageName; 

    return View(view, model); 
} 

現在,在您看來,使用DropDownListFor helper方法

@model YourPageViewModel 
@Html.DropDownListFor(m => m.SelectedLanguage, languages, 
               new { @class = "form-control" }); 

假設languagesSelectListItem的列表。將其替換爲您必須呈現下拉項目的集合。

該幫助程序將顯示名稱爲SelectedLanguage的下拉列表。所以請確保你在javasacript中更新了它。

$(function() { 

    $("#SelectedLanguage").change(function() { 
     var activeLanguage = $(this).val(); 
     window.location.href = "@Url.Action("index","Home")?languageName=" 
            + activeLanguage +"&[email protected]()"; 
    }); 

}); 
+0

我有一堆地方(元素)。那麼該怎麼做? – Bigeyes

+0

你的意思是一堆地方?你可以說得更詳細點嗎 ?還請閱讀我答案的最後一段?你爲什麼要打ajax電話? – Shyju

+0

我的意思是在你的回答'$(「#someDiv」)'。它只改變一個地方。我有'someDiv1','someDiv2'等。如何重新加載頁面?我做了ajax調用,因爲我想將參數'activeLanguage'傳遞給控制器​​。 – Bigeyes

0

您的AJAX請求正在返回您的視圖,但您沒有做任何處理。如果您的視圖是部分視圖,那麼您可以在AJAX調用中更改成功回調以更新HTML應該替換的頁面部分。

$.ajax({ 
    url: "/Some/Index", 
    datatype: "text", 
    data: { id: '@Model.Guid', languageName: activeLanguage }, 
    type: "POST", 
    success: function (html) { 
    $('.partial').html(html); 
    } 
}); 

或者,如果視圖確實是一個完整的頁面,那麼不要使用AJAX來發出請求。

+0

這不是局部視圖。 – Bigeyes

相關問題