更新 - 在SO和ASP.NET论坛上有很多关于不允许儿童操作执行重定向操作的帖子。下面的解决方案似乎是我在这个问题上看到的最简单的解决方法。如果你有这个问题 - 希望你会发现它有用。如果有一个更好的,我肯定愿意接受建议。
我这整天一直在捣乱我的大脑......
我有一个 FranchiseSet 模型和一个特许经营模型 - 关系是FranchiseSet有很多特许经营权。
在FranchiseSet索引视图上,有一个特许经营集合表,其中每一行都是可点击的。当我点击一行时,我会通过AJAX从 FranchiseSetController 的详细信息方法返回一个视图。
在该视图中还有一个表格,显示该特许经营权集合的所有相关特许经营权。从本质上讲,它是主/细节视图 - 这是看起来像:
有一个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方法成功保存新的Franchise,但是,我收到此错误:
不允许子操作执行重定向操作。
我已经在这个问题上看到了StackOverflow和ASP.NET论坛上的帖子 LOTS ,我试图实现一些解决方案 - 即使使用JavaScript重定向,但我仍然没有能够让它发挥作用。
据我所知,由于我已经在FranchiseSet控制器内部,它已经尝试基于FranchiseSet模型渲染视图,因此未定义特许经营模型的子视图。那么,处理父母和孩子行为之间互动的理想方式是什么?
如果没有通用的解决方案,这似乎是一个非常普遍的问题。或者至少没有一个我能找到的。我对.net mvc比较新,所以它可能只是我。
在这种情况下,使用@Html.Action
是一个糟糕的设计选择吗?我曾尝试使用@Html.RenderPartial
,但这会导致500内部服务器错误 - 即使我有Create方法设置来返回部分视图。
以下是我正在使用的FranchiseController创建操作 - 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.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方法,如上面提到的Russell。
使用此:@{ Html.RenderAction("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID }); }
我将它放在@{ }
标签中,因为我在这里学到了什么:Html.RenderPartial giving me strange overload error?
我能够让FranchiseController重定向回其父级 - FranchiseSetController的Index方法 - 没有任何问题。此外,它不需要我返回JSON并尝试进行JavaScript重定向 - 它是所有Razor视图代码。
我希望这可以解决如何将儿童操作重定向回父的问题。
答案 0 :(得分: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);
}
我在这个修复程序中做了几个假设。
@Html.Action("Create", "Franchise", new { FranchiseSetId = Model.FranchiseSetID })
时,您想要呈现该部分视图如果我错过了某些内容,请告诉我,我会更新我的答案,尝试提供更好的解决方案。