asp.net-mvc - ASP.NET MVC 4 - 模态保存后使用子操作重定向

标签 asp.net-mvc asp.net-mvc-3

更新 - 有很多关于的帖子不允许子操作执行重定向操作 在 SO 和 ASP.NET 论坛上。下面的解决方案似乎是我所见过的针对此问题的最简单的解决方法。如果你有这个问题 - 希望你会发现它有帮助。如果有更好的,我当然愿意接受建议。

我整天都在为此绞尽脑汁……

我有一个 特许经营型号和 加盟 模型 - 关系是一个 FranchiseSet 有-许多 Franchise。

在 FranchiseSet 索引 View 上有一个 Franchise Sets 表,其中每一行都是可点击的。当我单击一行时,我从 返回一个 View 详情 的方法FranchiseSetController - 通过 AJAX。

在该 View 中,还有一个表格,显示该特许经营集的所有相关特许经营权。本质上,它是一个 主/详细 查看 - 如下所示:

enter image description here

有一个 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 helper 调用 FranchiseController的创建方法:
@Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })

这是由此生成的模态:

enter image description here

Create 方法成功保存了新的特许经营权,但是,我收到此错误:

不允许子操作执行重定向操作。

我看过很多 StackOverflow 和 ASP.NET 论坛上关于这个问题的帖子,我已经尝试实现一些解决方案 - 即使使用 JavaScript 重定向,但我仍然无法让它工作。

我知道,由于我已经在 FranchiseSet Controller 内部,它已经在尝试基于 FranchiseSet 模型渲染 View ,因此 Franchise 模型的 subview - 未定义。那么处理父子行为之间交互的理想方式是什么?

这似乎是一个非常普遍的问题,没有一个共同的解决方案。或者至少我找不到。我对.net mvc 比较陌生,所以可能就是我。

正在使用 @Html.Action在这种情况下一个糟糕的设计选择?我尝试使用 @Html.RenderPartial但这会导致 500 Internal Server 错误——即使我设置了 Create 方法来返回部分 View 。

这是我正在使用的 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从看来似乎是问题的根源。

非常感谢任何建议!

解决方案

我使用了 Russell 在下面建议的修改后的模式代码,但是我在代码块中将 @Html.RenderPartial 方法切换为 @Html.RenderAction 方法。

这是它现在的样子。
<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>

我还修改了 Controller 的 Create 方法,就像上面建议的 Russell。

使用这个:@{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }
我把它放在 @{ }因为我在这里学到的东西的标签:Html.RenderPartial giving me strange overload error?

我能够让 FranchiseController 重定向回其父级 - FranchiseSetController 的 Index 方法 - 没有任何问题。另外,它不需要我返回 JSON 并尝试执行 JavaScript 重定向——这都是 Razor View 代码。

我希望这可以解决如何从 重定向的问题 child 操作返回 家长 .

最佳答案

试试这个为你的模态:

<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>

然后在您的 Controller 中,修复您的 GET 方法,使其返回部分 View 结果
//
// GET: /Franchise/Create

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

我在这个修复中做了几个假设。
  • 您的“创建” View 应该是包含所有表单输入的部分 View
  • 当您调用 @Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })你想要渲染那个局部 View
  • 您希望模态底部的“保存更改”链接实际保存您的模态,而不是显示的“创建”按钮

  • 如果我遗漏了什么,请告诉我,我会更新我的答案以尝试提供更好的解决方案。

    关于asp.net-mvc - ASP.NET MVC 4 - 模态保存后使用子操作重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11253676/

    相关文章:

    .net - 包管理器控制台不工作

    asp.net-mvc - asp.net-mvc 中的缓存

    c# - 如何在 ASP.NET WebAPI 中返回文件 (FileContentResult)

    c# - RichTextEditor 不适用于 ASP.NET MVC5 中的多个字段

    c# - 未在 View 模型内的模型上调用验证方法

    asp.net-mvc-3 - 将 ASP.NET MVC 3 与 Razor 一起使用,将 ICollection 添加到 Create View 的最有效方法是什么?

    c# - 我可以将某些东西注入(inject)到 MvcApplication 中吗?

    asp.net-mvc-3 - JQGrid隐藏列并分组排序

    asp.net-mvc-3 - Azure 云服务 503 实异常(exception)部错误

    asp.net-mvc - 动态对象的MVC3/4安全性和模型绑定(bind)