1

我正在研究 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 方法,该方法返回一个带有布局的完整视图,只返回那个,所以我有我的布局,带有视图,包含一个带有编辑视图的布局。

我真的不明白我该如何解决这个问题?

我很确定这是我的设计缺陷,但我无法弄清楚。

提前致谢!!

4

1 回答 1

1

考虑使用:

return RedirectToAction("Index")

代替:

return View("Index");

如果用户实际上被重定向到Index而不是留在EditLanguage. 如果用户点击刷新按钮,则不会使用这种方法重新发送数据。

于 2012-07-31T14:25:27.397 回答