更新- 有很多关于不允许在 SO 和 ASP.NET 论坛上执行重定向操作的子操作的帖子。下面的解决方案似乎是我所见过的针对此问题的最简单的解决方法。如果你有这个问题 - 希望你会发现它有帮助。如果有更好的,我当然愿意接受建议。
我整天都在为此绞尽脑汁……
我有一个FranchiseSet模型和一个Franchise模型——关系是 FranchiseSet 有很多特许经营权。
在 FranchiseSet 索引视图上有一个 Franchise Sets 表,其中每一行都是可点击的。当我单击一行时,我从FranchiseSetController的Details方法返回一个视图- 通过 AJAX。
在该视图中,还有一个表格,显示该特许经营集的所有相关特许经营权。从本质上讲,它是一个主/详细视图 - 如下所示:
有一个 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 控制器内部,它已经在尝试基于 FranchiseSet 模型渲染视图,因此 Franchise 模型的子视图是未定义的。那么处理父子行为之间交互的理想方式是什么?
这似乎是一个非常普遍的问题,没有一个共同的解决方案。或者至少我找不到。我对.net mvc 比较陌生,所以可能就是我。
在这种情况下是否使用@Html.Action
了错误的设计选择?我曾尝试使用@Html.RenderPartial
,但这会导致 500 Internal Server 错误 - 即使我有 Create 方法设置以返回部分视图。
这是我正在使用的 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>
我还修改了控制器的 Create 方法,就像上面建议的 Russell。
使用这个: @{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }
由于我在这里学到的东西,我将它放在@{ }
标签中: Html.RenderPartial 给我奇怪的重载错误?
我能够让 FranchiseController 重定向回其父级 - FranchiseSetController 的 Index 方法 - 没有任何问题。另外,它不需要我返回 JSON 并尝试执行 JavaScript 重定向——这都是 Razor 视图代码。
我希望这可以解决如何从Child动作重定向回Parent的问题。