我正在處理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