子操作不允许执行重定向操作 [英] Child actions are not allowed to perform redirect actions

查看:89
本文介绍了子操作不允许执行重定向操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

在视图中

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

这是模态内容的视图:

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

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

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

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

Child actions are not allowed to perform redirect actions.

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

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"

更新

这个...

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

似乎是指向此...

public ActionResult Edit(Events_Info_tbl events_info_tbl)

当您实际希望它指向此...时

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

public ActionResult Edit(int id = 0)

Html.Action

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

这篇关于子操作不允许执行重定向操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆