【问题标题】:ASP.Net MVC Refresh Page without destroying ViewModelASP.Net MVC 刷新页面而不破坏 ViewModel
【发布时间】:2015-03-31 14:12:17
【问题描述】:

我想创建一个多语言网页。要在语言之间切换,我的页面上有一个下拉菜单。如果下拉菜单的更改事件被触发,则会调用我的控制器中名为“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”属性 - 但引用为空。谁能解释为什么 HVM 在我的 ChangeLanguage 方法中为空?

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

例如

@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});
}

【问题讨论】:

  • 因为您还没有初始化HVM 的新实例(当您调用控制器方法时,会创建控制器的新实例 - 您无权访问您在之前调用 get 方法)。您需要将值保存在某处(例如数据库)
  • 而你的制作和 ajax 调用在 “重新加载我的整个页面” 中没有多大意义。要么用你想在 DOM 中更新的新值返回 json(参见我对your last question 的回答),要么更改方法以基于新语言返回部分视图并更新 DOM

标签: c# jquery asp.net-mvc


【解决方案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 库,可以轻松完成数据绑定。

【讨论】:

  • @Chill-X - 添加到我的答案中。
  • 谢谢,刷新整个页面应该没问题 - 现在我面临缓存问题 - 我正在调用返回新视图的 ChangeLanguage 方法 - 但我的标签不会改变(尽管应该显示的值不同)。有没有办法强制客户端在返回 ActionResult 时不使用缓存?我在 URL 中阅读了一些关于随机数的内容,但我真的不知道如何使用 ActionResult 来做到这一点。
  • @Chill-X - 你不应该面对这个问题。我怀疑这与您调用和呈现页面的方式有关。我建议您在视图和控制器代码中添加一个新问题。
【解决方案2】:

将你的方法更改为这些方法,这个技巧对你有用=>将你的模型传递给从视图中更改语言。还将 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多