私はMVCWebアプリの管理部分に取り組んでいます。単一の管理パネルに「ウィジェット」を使用することを考えました。最初に私の意図を説明します。
言語テーブルがあります。そのために、それらの言語のドロップダウンリストと[編集]ボタン1つを使用して部分ビューを作成します。これにより、ユーザーは非部分ビューに移動して言語を編集できます。[保存]をクリックすると、ユーザーはインデックスビューにリダイレクトされ、ドロップダウンリストが再び表示されます。
したがって、非部分ビューとして「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 => l.LanguageId == model.SelectedItem); 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リクエストであると想定し、インデックスビューをレンダリングすると、HttpPostをレンダリングする必要があると想定して「LanguageWidget」メソッドを呼び出します。方法。
これにより、LanguageWidget HttpPostメソッドが表示されます。このメソッドは、レイアウトを含む完全なビューを返し、それだけを返します。したがって、レイアウトを含むビューと、editviewを含むレイアウトがあります。
どうすればこれを修正できるのか本当にわかりませんか?
私の側からは設計上の欠陥だと確信していますが、理解できません。
前もって感謝します!!