加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 03:21:55 所属栏目:asp.Net 来源:网络整理
导读:更新 – 有很多关于子操作的帖子不允许在SO和ASP.NET论坛上执行重定向操作.下面的解决方案似乎是我在这个问题上看到的最简单的解决方法.如果你有这个问题 – 希望你会发现它有用.如果有更好的,我肯定愿意接受建议. 这一整天我一直在震撼我的大脑…… 我有一
更新 – 有很多关于子操作的帖子不允许在SO和ASP.NET论坛上执行重定向操作.下面的解决方案似乎是我在这个问题上看到的最简单的解决方法.如果你有这个问题 – 希望你会发现它有用.如果有更好的,我肯定愿意接受建议.

这一整天我一直在震撼我的大脑……

我有一个FranchiseSet模型和一个Franchise模型 – 关系是FranchiseSet有很多特许经营权.

在FranchiseSet索引视图中,有一个特许经营集表,其中每一行都是可点击的.当我单击一行时,我从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",new { FranchiseSetId = Model.FranchiseSetID })

这是从中生成的模态:

Create方法成功保存新的Franchise,但是,我收到此错误:

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

我已经在这个问题上看到很多关于StackOverflow和ASP.NET论坛的帖子,我试图实现一些解决方案 – 甚至使用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();
    }
}

返回RedirectToAction(“Index”,“FranchiseSet”);与视图中的@ Html.Action一起似乎是问题的根源.

任何建议都非常感谢!

我使用了Russell在下面提出的修改后的模态代码,但是我在代码块中为@ Html.RenderAction方法切换了@ Html.RenderAart方法.

这就是现在的样子.

<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",FormMethod.Post))
      {
         <div id="create_franchise_modal_body" class="modal-body">
           @{ Html.RenderAction("Create",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视图代码.

我希望这解决了如何将子操作重定向回Parent的问题.

解决方法

试试你的模态:

<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",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”,new {FranchiseSetId = Model.FranchiseSetID})时,您想要渲染该局部视图
>您希望模式底部的“保存更改”链接实际保存您的模态,而不是显示的“创建”按钮

如果我错过了一些让我知道的内容,我会更新我的答案,试着提供更好的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读