ASP.Net MVC刷新页面不会破坏ViewModel

时间:2015-03-31 05:51:32

标签: c# jquery asp.net-mvc

我想创建一个多语言网页。要在语言之间切换,我的页面上有一个下拉列表。如果下拉列表的更改事件被触发,则调用我的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});
}

2 个答案:

答案 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);
}