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

时间:2015-04-09 03:22:18

标签: c# asp.net asp.net-mvc

我在编辑页面中使用了modal,这是我的代码:

在视图中

<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
   Edit
</button>

<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                <h4 class="modal-title" id="myModalLabel">Edit Event Information</h4>
            </div>
            <div class="modal-body">
                @Html.Action("Edit", "Admin",new { id = Model.events_info_id,@class = "btn btn-warning"})
            </div>
        </div>
    </div>
</div>

这个控制器用于获取要在模态中显示的信息:

[ChildActionOnly]
    public ActionResult Edit(int id = 0)
    {
        Events_Info_tbl events_info_tbl = db.Events_Info_tbl.Find(id);
        if (events_info_tbl == null)
        {
            return HttpNotFound();
        }
        return PartialView(events_info_tbl);
    }

这是模态内容的视图:

@model Online_Ballot.Models.Events_Info_tbl

<script src="~/Scripts/Datepicker.js"></script>
<div class="modal-body" style="color:green">
    <h2>Edit Events</h2>
    @using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @Html.HiddenFor(model => model.events_info_id)
    <div class="form-group">
        <label for="usr">Event Name:</label>
        @Html.EditorFor(model => model.events_name, new { @class="form-control"})
        @Html.ValidationMessageFor(model => model.events_name)
    </div>
    <div class="form-group">
        <label for="usr">Votation Date:</label>
        @Html.EditorFor(model => model.events_votation_date, new { @id="voters_bdate"})
        @Html.ValidationMessageFor(model => model.events_votation_date)
    </div>
    <div class="form-group">
        <label for="usr">Votation Place:</label>
        @Html.EditorFor(model => model.events_place, new { @class="form-control"})
        @Html.ValidationMessageFor(model => model.events_place)
    </div>

        <div class="form-group">
        <label for="comment">Event Description:</label>
        @Html.TextAreaFor(model => model.events_desc)
    </div>
        <div class="form-group">
        <label for="usr">Is active:</label>
        @Html.EditorFor(model => model.is_active, new { @class="form-control"})
        @Html.ValidationMessageFor(model => model.is_active)
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary">Save changes</button>
    </div>
}

此控制器将更新数据:

// POST: /Admin/Edit/5
[ValidateAntiForgeryToken]
public ActionResult Edit(Events_Info_tbl events_info_tbl)
{
    if (ModelState.IsValid)
    {
        db.Entry(events_info_tbl).State = EntityState.Modified;
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    return View(events_info_tbl);
}

当我尝试运行此代码时出现此错误:

  

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

但是,它会更新数据,我想不允许调用RedirectToAction函数,但我需要。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的孩子行为不应该尝试更新任何内容。它应该是获取数据,填充内容并返回一些视图。

您可能希望将操作拆分为两个操作。一个用于呈现“编辑”表单,另一个用于更新该表单。

[HttpPost]
public ActionResult Edit(Events_Info_tbl events_info_tbl)
{
    if (ModelState.IsValid)
    {
        //Save

        return RedirectToAction("Index");
    }

    //Return view
    //NOTE: Make sure your page state is preserved i.e. your modal is open
    return View(events_info_tbl);
}

[ChildActionOnly]
public PartialViewResult RenderEditForm(int id)
{
    //Build form data
    return PartialView("_EditForm");
}

另一个注意事项,你在这里与“编辑”和“部分”剃刀助手如何工作有一些冲突。对于将数据放入控制器模型没有意义的视图,子操作很有用。如果模型适合,那么只需使用“编辑器”或“部分”

<强>更新

此...

@Html.Action("Edit", "Admin",new { id = Model.events_info_id,@class = "btn btn-warning"})

似乎指向了这个......

public ActionResult Edit(Events_Info_tbl events_info_tbl)

当你真的希望它指向这个......

public ActionResult Edit(int id = 0)

Html.Action

中相应地编辑控制器
@Html.Action("Edit", "MyController",new { id = Model.events_info_id,@class = "btn btn-warning"})