2017-08-08 42 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

相关问题