5

更新- SO および ASP.NET フォーラムでは、子アクションがリダイレクト アクションを実行することは許可されていないという投稿が多数あります。以下の解決策は、この問題に対して私がこれまでに見た中で最も簡単な回避策のようです。この問題が発生した場合は、お役に立てば幸いです。より良いものがあれば、私は確かに提案を受け入れます。


私は一日中これで頭を悩ませてきました...

私はFranchiseSetモデルとFranchiseモデルを持っています - FranchiseSet には多くのフランチャイズがあるという関係があります。

フランチャイズ セットのインデックス ビューには、各行をクリックできるフランチャイズ セットのテーブルがあります。行をクリックすると、AJAX を介してFranchiseSetControllerのDetailsメソッドからビューが返されます。

そのビュー内には、そのフランチャイズ セットに関連するすべてのフランチャイズを示すテーブルもあります。基本的に、これはマスター/詳細ビューです。これは次のようになります。

ここに画像の説明を入力

フランチャイズの作成フォームを表示するために使用されている Twitter Bootstrap モーダルがあります。これは次のようになります。

<div class="modal hide fade in" id="myModal" )>
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">×</button>
        <h3>Modal header</h3>
      </div>
      <div id="create_franchise_modal_body" class="modal-body">
        @Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })       
      </div>
      <div class="modal-footer">
        <a href="#" class="btn" data-dismiss="modal">Close</a>
        <a href="#" class="btn btn-primary">Save changes</a>
      </div>
    </div>

モーダルの本体内で、@Html.Actionヘルパーを使用してFranchiseController の Createメソッドを呼び出しています。

@Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })

そこから生成されるモーダルは次のとおりです。

ここに画像の説明を入力

Create メソッドは新しいフランチャイズを正常に保存していますが、次のエラーが発生します。

子アクションはリダイレクト アクションを実行できません。

この問題について、StackOverflow と ASP.NET フォーラムで多くの投稿を見てきました。JavaScriptリダイレクトを使用して、いくつかの解決策を実装しようとしましたが、まだこれを機能させることができませんでした。

私はすでに FranchiseSet Controller の内部にいるため、すでに FranchiseSet モデルに基づいてビューをレンダリングしようとしているため、フランチャイズ モデルの子ビューは未定義であることを理解しています。では、親と子のアクション間の相互作用を処理する理想的な方法は何ですか?

これは、共通の解決策がない非常に一般的な問題のようです。または、少なくとも私が見つけることができるものではありません。私は.net mvcに比較的慣れていないので、私だけかもしれません。

@Html.Actionこのシナリオでは、不適切な設計の選択を使用していますか? 使用しようとしまし@Html.RenderPartialたが、部分ビューを返すように Create メソッドを設定していても、500 Internal Server エラーが発生します。

私が使用している FranchiseController Create アクション (GET と POST の両方) は次のとおりです。

//
// GET: /Franchise/Create

public ActionResult Create(int FranchiseSetId)
{
    ViewBag.PossibleFranchiseSets = franchisesetRepository.All;
    var franchise = new Franchise { FranchiseSetId = FranchiseSetId };
    return PartialView(franchise);
} 

//
// POST: /Franchise/Create

[HttpPost]
public ActionResult Create(Franchise franchise)
{
    if (ModelState.IsValid) {
        franchiseRepository.InsertOrUpdate(franchise);
        franchiseRepository.Save();
        return RedirectToAction("Index", "FranchiseSet");
    } else {
        ViewBag.PossibleFranchiseSets = franchisesetRepository.All;
        return View();
    }
}

ビューからの とのreturn RedirectToAction("Index", "FranchiseSet");組み合わせが@Html.Action問題の原因のようです。

どんなアドバイスでも大歓迎です!


解決


以下でラッセルが提案した修正されたモーダル コードを使用しましたが、コード ブロック内で @Html.RenderAction メソッドの @Html.RenderPartial メソッドを切り替えました。

これが今の様子です。

<div class="modal hide fade in" id="myModal" )>
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">×</button>
        <h3>Modal header</h3>
      </div>
      @using (Html.BeginForm("Create", "Franchise", FormMethod.Post))
      {
         <div id="create_franchise_modal_body" class="modal-body">
           @{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }
         </div>
         <div class="modal-footer">
           <a href="#" class="btn" data-dismiss="modal">Close</a>
           <button type="submit" class="btn btn-primary">Save changes</button>
         </div>
      }
  </div>

上記のラッセルが提案したように、コントローラーの Create メソッドも変更しました。

これを使用して: @{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }

@{ }ここで学んだことのために 、タグ内に入れています: Html.RenderPartial で奇妙なオーバーロード エラーが発生しましたか?

問題なく FranchiseController をその親である FranchiseSetController の Index メソッドにリダイレクトすることができました。さらに、JSON を返して JavaScript リダイレクトを実行する必要はありませんでした。すべて Razor ビュー コードです。

これで、 ChildアクションからParentにリダイレクトする方法の問題が解決されることを願っています。

4

1 に答える 1

2

モーダルでこれを試してください:

<div class="modal hide fade in" id="myModal" )>
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal">×</button>
        <h3>Modal header</h3>
      </div>
      @using (Html.BeginForm("Create", "Franchise", FormMethod.Post))
      {
         <div id="create_franchise_modal_body" class="modal-body">
           @Html.RenderPartial("Create")
         </div>
         <div class="modal-footer">
           <a href="#" class="btn" data-dismiss="modal">Close</a>
           <button type="submit" class="btn btn-primary">Save changes</button>
         </div>
      }
 </div>

次に、コントローラーで GET メソッドを修正して、部分ビューの結果を返すようにします。

//
// GET: /Franchise/Create

public PartialViewResult Create(int FranchiseSetId)
{
    ViewBag.PossibleFranchiseSets = franchisesetRepository.All;
    var franchise = new Franchise { FranchiseSetId = FranchiseSetId };
    return PartialView(franchise);
} 

この修正では、いくつかの仮定を立てました。

  1. 「作成」ビューは、すべてのフォーム入力を含む部分ビューであると想定されています
  2. あなたが呼び出すとき、@Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })あなたはその部分的なビューをレンダリングしたいです
  3. 表示される「作成」ボタンではなく、モーダルを実際に保存するには、モーダルの下部にある「変更を保存」リンクが必要です。

何か見逃した場合はお知らせください。より良い解決策を提供するために回答を更新します。

于 2012-06-28T22:46:50.687 に答える