1

私は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を含むレイアウトがあります。

どうすればこれを修正できるのか本当にわかりませんか?

私の側からは設計上の欠陥だと確信していますが、理解できません。

前もって感謝します!!

4

1 に答える 1

1

以下の使用を検討してください。

return RedirectToAction("Index")

それ以外の:

return View("Index");

Indexユーザーがに留まるのではなく、実際にリダイレクトされると、より論理的に見える場合がありますEditLanguage。また、ユーザーが更新ボタンを押すと、このアプローチを使用してデータが再送信されることはありません。

于 2012-07-31T14:25:27.397 に答える