我正在处理MVC webapp的管理部分。我的想法是使用“小部件”为单个管理控制台。我会先解释我的意图。部分视图HttpPost被调用而不是HttpGet
我有一个语言表,为此我想用这些语言的下拉列表和一个单一的按钮“编辑”创建一个局部视图,这将使用户到一个非局部视图来编辑语言。点击保存后,用户将被重定向到Index视图,该视图将再次显示下拉列表。
所以我有一个“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] 公共的ActionResult LanguageW idget(LanguageWidgetModel模型) {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);
}
}
所以,当我回来的“索引”视图 - 这似乎是合乎逻辑我猜 - 控制器仍然假定这是一个HttpPost请求,当它呈现指数来看,它调用“LanguageWidget”的方法,假设它必须呈现HttpPost方法。
这导致了LanguageWidget HttpPost方法,该方法返回布局全视图,只返回该视图,所以我使用editview获取包含布局的布局和视图。
我真的不明白我该如何解决这个问题?
我很确定这是我的设计缺陷,但我无法弄清楚。
在此先感谢!
是的!这就是诀窍!这很合乎逻辑! :),我还在我的LanguageWidget发布操作中使用了redirecttoaction!谢谢! – 2012-07-31 14:33:23