在问了几个关于如何根据下拉控件的选定值刷新页面的问题后,我现在有了一个新问题——不知何故,我的"ChangeLanguage"方法返回了我的视图的缓存版本。
视图:
@model ViewModels.HomeViewModel
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<script src="~/Scripts/jquery-1.10.2.js" type="text/javascript"></script>
<title id="Title">Default</title>
</head>
<body>
<div class="Header">
<div class="HeaderTextArea">
<span id="HeaderText">
@Model.Title.Where(o => o.Language.Equals(Model.SelectedLanguage)).FirstOrDefault().ControlText
</span>
</div>
<div class="HeaderImageArea">
<img id="RB_Image" src="~/Content/Images/RB_Logo.png" alt="RB_IMAGE" />
</div>
<div class="LanguageSelection">
@{
@Html.DropDownList("SelectedLanguage", new SelectList(Model.AvailableLanguages, "ID", "Description"))
}
</div>
</div>
<div class="Content">
@RenderBody()
</div>
<script>
var url = '@Url.Action("ChangeLanguage", "Home")';
$('#SelectedLanguage').change(function () {
$.getJSON(url, {
ID: $(this).val(), Model: @Html.Raw(Json.Encode(Model))
});
});
请注意,这是我的布局视图。我也在我的索引上尝试过,结果也是一样的。
控制器:
public class HomeController : Controller
{
public ViewModels.HomeViewModel HVM { get; private set; }
// GET: Home
public ActionResult Index()
{
this.HVM = new ViewModels.HomeViewModel();
this.HVM.SelectedLanguage = this.HVM.AvailableLanguages.First();
return View(this.HVM);
}
public ActionResult ChangeLanguage(int id, ViewModels.HomeViewModel model) {
model.SelectedLanguage = model.AvailableLanguages.Where(o => o.ID.Equals(id)).First();
model.SelectedTitle = model.Title.Where(o => o.Language.Equals(model.SelectedLanguage)).First();
return View("Index", model);
}
}
调用ChangeLanguage方法,修改所需的数据,并按预期返回一个"新"视图-视图中的逻辑也完成了它的工作-但预期的内容没有显示-而是显示"第一个视图"中的数据。因此,数据和显示的数据不同。
Ps。我知道视图应该是愚蠢的,不应该在里面放置任何逻辑,但这只是为了测试目的。最后,所有的东西都应该位于我的ViewModels中。
您没有缓存任何内容。ajax调用保持在同一页面上。您正在调用一个返回视图的方法(它应该是部分视图),但随后您对该内容不做任何操作(即更新DOM)。您的脚本还使用$.getJSON()
,它需要json,但您的控制器方法返回html,因此无论如何都无法工作。此外,不要使用@Html.Raw(Json.Encode(Model)
传递回整个模型。这将传递您在控制器中已经可以访问的原始模型(未更改),因此它只会降低性能。
你可以考虑的3个选项
- 将所选语言传递给返回json的控制器方法正如我在回答你之前的一个问题时所指出的那样。这将提供最佳性能
- 将所选语言传递给控制器方法,该方法返回部分视图并更新DOM
控制器(除钞public ViewModels.HomeViewModel HVM { get; private set; }
)
public PartialViewResult ChangeLanguage(int id) {
HomeViewModel model = new HomeViewModel();
model.SelectedLanguage = model.AvailableLanguages.Where(o => o.ID.Equals(id)).First();
model.SelectedTitle = model.Title.Where(o => o.Language.Equals(model.SelectedLanguage)).First();
return PartialView(model); // the partial just contains the elements you want to update
}
查看
<div id="mycontent"></div>
$('#SelectedLanguage').change(function () {
$('#mycontent').load(url, { ID: $(this).val() });
});
- 如果你不关心性能,可以将dropdownlist放在一个带有提交按钮的表单中,然后进行正常的提交(如果你想生成一个完整的新视图,那么使用ajax并没有什么实际意义)
添加OutputCache属性,如下所示
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult ChangeLanguage(int id, ViewModels.HomeViewModel model) {