2012-07-31 42 views
1

我正在处理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获取包含布局的布局和视图。

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

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

在此先感谢!

回答

1

考虑使用:代替

return RedirectToAction("Index") 

return View("Index"); 

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

+0

是的!这就是诀窍!这很合乎逻辑! :),我还在我的LanguageWidget发布操作中使用了redirecttoaction!谢谢! – 2012-07-31 14:33:23

相关问题