部分视图调用HttpPost而不是HttpGet

时间:2012-07-31 14:18:35

标签: asp.net-mvc-3 razor

我正在研究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。

我真的不知道如何解决这个问题?

我很确定这是我个人的设计缺陷,但我无法理解。

提前致谢!!

1 个答案:

答案 0 :(得分:1)

考虑使用:

return RedirectToAction("Index")

而不是:

return View("Index");

如果用户实际上被重定向到Index而不是,那么这似乎更合乎逻辑 留在EditLanguage。如果用户点击刷新按钮,则不会使用此方法重新发送数据。