我正在研究MVC webapp的管理部分。我有想法为单个管理面板使用“小部件”。我先解释一下我的意图。
我有一个语言表,为此我想创建一个局部视图,其中包含这些语言的下拉列表和单个按钮“编辑”,这将使用户进入非局部视图来编辑语言。单击“保存”后,用户将被重定向到“索引”视图,该视图将再次显示下拉列表。
所以我有一个“Index.cshmtl”,一个“EditLanguage.cshtml”作为非部分视图,一个“LanguageWidget.cshtml”作为局部视图。
首先,用户会看到索引视图。
public ViewResult Index()
{
return View();
}
此视图中包含以下代码:
@using CodeBox.Domain.Concrete.ORM
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>Administration</h2>
@Html.Action("LanguageWidget")
部分视图“LanguageWidget”只包含以下代码,当用户提交时,它会发布到我控制器中的HttpPost注释方法:
@using (Html.BeginForm("LanguageWidget", "Admin"))
{
@Html.DropDownListFor(model => model.SelectedItem, Model.Languages)
<input type="submit" value="Edit"/>
}
这是小部件的HttpPost方法: [HttpPost] public ActionResult LanguageWidget(LanguageWidgetModel model) { var lang = langRepo.Languages.FirstOrDefault(l =&gt; l.LanguageId == model.SelectedItem); return View(“EditLanguage”,lang); }
这会将用户带到语言编辑页面,该页面工作正常。
但是呢!用户编辑语言并提交页面,该页面调用“EditLanguage”HttpPost方法,以便正确保存语言。
[HttpPost]
public ViewResult EditLanguage(Language model)
{
if (ModelState.IsValid)
{
langRepo.SaveLanguage(model);
TempData["message"] = string.Format("{0} has been saved!", model.Name);
return View("Index");
}
else
{
return View(model);
}
}
所以,当我返回“索引”视图时 - 我觉得这似乎是合乎逻辑的 - 控制器仍假设这是一个HttpPost请求,当它呈现索引视图时,它会调用“LanguageWidget”方法,假设它必须渲染HttpPost方法。
这导致了LanguageWidget HttpPost方法,该方法返回一个带有布局的完整视图,只返回那个,所以我的布局,包含一个布局,包含了editview。
我真的不知道如何解决这个问题?
我很确定这是我个人的设计缺陷,但我无法理解。
提前致谢!!
答案 0 :(得分:1)
考虑使用:
return RedirectToAction("Index")
而不是:
return View("Index");
如果用户实际上被重定向到Index
而不是,那么这似乎更合乎逻辑
留在EditLanguage
。如果用户点击刷新按钮,则不会使用此方法重新发送数据。