我正在研究 MVC webapp 的管理部分。我的想法是为单个管理面板使用“小部件”。我会先说明我的意图。
我有一个语言表,为此我想创建一个局部视图,其中包含这些语言的下拉列表和一个“编辑”按钮,它将用户带到非局部视图来编辑语言。单击保存后,用户将被重定向到索引视图,该视图将再次显示下拉列表。
所以我有一个“Index.cshmtl”和一个“EditLanguage.cshtml”作为非部分视图,还有一个“LanguageWidget.cshtml”作为部分视图。
首先,用户会看到 Index 视图。
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 => 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);
}
}
所以,当我返回“Index”视图时——我猜这似乎是合乎逻辑的——控制器仍然假设这是一个 HttpPost 请求,并且当它呈现 Index 视图时,它调用“LanguageWidget”方法,假设它必须呈现 HttpPost方法。
这导致了 LanguageWidget HttpPost 方法,该方法返回一个带有布局的完整视图,只返回那个,所以我有我的布局,带有视图,包含一个带有编辑视图的布局。
我真的不明白我该如何解决这个问题?
我很确定这是我的设计缺陷,但我无法弄清楚。
提前致谢!!