简体   繁体   中英

Child actions are not allowed to perform redirect actions

I used modal in my edit page and here is my code:

In the View

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

This the controller to get the information to be display in the modal:

[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);
    }

This the View of the content of the Modal:

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

This Controller will update the data:

// 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);
}

When I try to run this code I got this error:

Child actions are not allowed to perform redirect actions.

But, it updates the data, I guess it not allowed to call RedirectToAction function but I need to. How I am going to fix this one?

Your child action shouldn't be attempting to update anything. It should be getting data, populating something, and returning some view.

You probably want to split your action into two actions. One for rendering the "Edit" form and another for updating that form.

[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");
}

Another note, you have some collision here to how the "Editor" and "Partial" razor helpers can work. Child actions are good for views where it doesn't make sense to fit the data into the controllers model. If the model fits then just use "Editor" or "Partial"

UPDATE

This...

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

appears to be pointing to this...

public ActionResult Edit(Events_Info_tbl events_info_tbl)

when you actually want it to point to this...

public ActionResult Edit(int id = 0)

edit the controller accordingly in Html.Action

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM