2015-03-31 192 views
0

我想创建一个多语言网页。要在不同的语言之间切换,我的网页上有一个下拉菜单。如果下拉菜单中的更改事件被触发,则调用Controller中名为“ChangeLanguage”的Method。ASP.Net MVC刷新页面不破坏ViewModel

public ViewModels.HomeViewModel HVM { get; private set; } 
    // GET: Home 
    public ActionResult Index() 
    { 
     this.HVM = new ViewModels.HomeViewModel(); 
     return View(this.HVM); 
    } 

    public JsonResult ChangeLanguage(int id) { 
     return Json(new {Success = true}); 
    } 

现在我想在我的ViewModel(HVM)中更改我的“SelectedLanguage”属性 - 但引用为空。任何人都可以解释为什么我的ChangeLanguage方法中HVM为空?

我SelectedLanguage属性改变后,我想我重新加载整个页面来显示它的文本在另一种语言

例如

@model ViewModels.HomeViewModel 
<html> 
<div class="HeaderText"> 
    Text = @{ 
     @Model.TextToDisplay.Where(o => 
     o.Language.Equals(Model.SelectedLanguage)).First() 
    } 
</div> 

这里就是我想在伪做:

伪代码:

public JsonResult ChangeLanguage(int id) { 
    this.HVM.SelectedLanguage = 
    this.HVM.AvailableLanguages.Where(o => 
    o.ID.Equals(id)).First(); 

    Page.Reload(); 
    return Json(new {Success = true}); 
} 
+0

由于您尚未初始化'HVM'的新实例(当您调用控制器方法时,将创建控制器的新实例 - 您无权访问您在先前调用中设置的属性到get方法)。您需要在某个地方保留该值(例如,一个数据库) – 2015-03-31 05:55:47

+0

而你的制作和ajax调用所以没有太多的意义在_“重新加载我的整个页面”_。要么返回json与你想在DOM中更新的新值(请参阅我对[你的最后一个问题]的答案)(http://stackoverflow.com/questions/29257173/asp-net-mvc-update-viewmodel-on-dropdown -selection-changed))或更改方法以基于新语言返回部分视图并更新DOM – 2015-03-31 06:07:59

回答

1
May anyone explain why HVM is null in my ChangeLanguage Method? 

秉承HTTP协议无状态特性,所有的(除非明确地添加到请求头中)的请求(MVC方法调用)与其关联的松散状态数据。 Web服务器将每个请求处理为一个新请求,并从控制器本身创建新的类实例。

在你的情况,因为它是一个新的请求,控制器已经定义了一个HVM属性,但是在ChangeLanguage中它没有被实例化(它只被实例化到Index方法中,当你调用ChangeLanguage时它不会被调用),因此它是空的。

我的SelectedLanguage属性更改后,我想重新加载我的 整个页面以显示其他语言的文本。

选项1:刷新页

实现简单的选项。将语言选择传递给服务器,服务器将返回具有特定数据的新视图。缺点是,整个页面将刷新。

选项2:更新视图的选择

如果选项1是真的不能接受,则考虑这个选项。有多种方式可以实现它。基本上它涉及(a)打破你查看到部分视图,并只更新受选择影响的部分或(b)用JS对象绑定数据元素。 (a) - 没有太多需要说的是这个。 (b) - 如果您使用像KnockoutJS这样的JS库,则可以轻松完成数据绑定。

+0

有没有办法解决这个问题? – C4p741nZ 2015-03-31 06:07:05

+0

@寒意X - 添加到我的答案。 – SBirthare 2015-03-31 06:13:10

+0

谢谢,刷新整个页面应该没问题 - 现在我正面临缓存问题 - 我打电话给我的ChangeLanguage方法,它返回一个新的视图 - 但我的标签不会被更改(尽管应显示的值不同)。有没有办法强制客户端在返回ActionResult时不要使用缓存?我在URL中读了一些关于随机数的内容,但我真的不知道如何使用ActionResult来做到这一点。 – C4p741nZ 2015-03-31 06:31:09

0

改变你的方法到这些方法,这个技巧将为你工作=>传递你的模型来改变语言从视图。同时将JsonResult更新为ActionResult。

public ActionResult ChangeLanguage(ViewModels.HomeViewModel model,int id) 
{ 
this.HVM.SelectedLanguage = 
this.HVM.AvailableLanguages.Where(o => 
o.ID.Equals(id)).First(); 
return RedirectToAction("Index",model); 
} 

public ActionResult Index(ViewModels.HomeViewModel model) 
{ 
if(model == null) 
{ 
    this.HVM = new ViewModels.HomeViewModel(); 

} 
return View(this.HVM); 
}