我想创建一个多语言网页。要在语言之间切换,我的页面上有一个下拉列表。如果下拉列表的更改事件被触发,则调用我的Controller中名为“ChangeLanguage”的方法。
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”属性 - 但是Reference为null。任何人都可以在我的ChangeLanguage方法中解释为什么HVM为空?
在我的SelectedLanguage属性发生变化后,我想重新加载整个页面,用另一种语言显示它的文本
e.g。
@model ViewModels.HomeViewModel
<html>
<div class="HeaderText">
Text = @{
@Model.TextToDisplay.Where(o =>
o.Language.Equals(Model.SelectedLanguage)).First()
}
</div>
这是我想在PseudoCode中做的事情:
伪代码:
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 :(得分:1)
May anyone explain why HVM is null in my ChangeLanguage Method?
遵循HTTP协议的无状态特性,所有(除非明确添加到请求头中)请求(MVC方法调用)松散与之关联的状态数据。 Web服务器将每个请求视为新请求,并从控制器本身创建新的类实例。
在你的情况下,因为它是一个新的请求,控制器有一个HVM属性定义,但在ChangeLanguage中它没有实例化(它只被实例化到Index方法,当你调用ChangeLanguage时没有被调用)因此它是null。
在我的SelectedLanguage属性发生变化后,我想重新加载我的 整页用另一种语言显示它的文本。
选项1:刷新页面
实施简单的选项。将语言选择传递给服务器,服务器将返回包含特定数据的新视图。缺点,整个页面都会刷新。
选项2:有选择地更新视图
如果选项1确实不可接受,请考虑此选项。有多种方法可以实现它。基本上它涉及(a)将视图分解为局部视图并仅更新受选择影响的部分或(b)将数据元素与JS对象绑定。
(a) - 对此并不需要说。
(b) - 如果您使用像KnockoutJS这样的JS库,则可以轻松完成数据绑定。
答案 1 :(得分:0)
将您的方法更改为这些方法,此技巧适用于您=&gt;将您的模型传递给视图中的更改语言。还要将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);
}