0

I'm having a problem with partial views. I have an index view of Announcements and I'm trying to add a partial view to create a new Announcement within the same page.

I can display the partial view, and submit the form to create a new record. The record gets submitted into the database, but when re-rendering the page, I get the error: Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper', {"Child actions are not allowed to perform redirect actions."} on my Html.Action statement in my index page.

I've been struggling to make this work, and have firstly changed the Html.Partial to a Html.Action statement as the controller methods weren't firing, then secondly, after I read that this error is because while rendering the page, .NET doesn't know what my redirect action is doing so automatically stops it, tried changing the Html.Action to Html.RedirectAction inside a code block, but still get the same error detailed above.

My model is quite simple:

public class Announcement
{
    public Announcement()
    {
        AnnouncementDate = System.DateTime.Now;
    }

    [Key]
    public int AnnouncementID { get; set; }

    public string Title { get; set; }
    public string Type { get; set; }

}

My Controller methods:

public ViewResult Index(string searchString, int? page)
    {
        var Announcements = from a in db.Announcements
                        select a;
        if (!String.IsNullOrEmpty(searchString))
        {
            Announcements = Announcements.Where(s => (s.Title.ToUpper().Contains(searchString.ToUpper()) || s.AnnouncementText.ToUpper().Contains(searchString.ToUpper())));
        }
        Announcements = Announcements.OrderBy(s => s.Title);

        int pageSize = 10;
        int pageNumber = (page ?? 1);

        return View(Announcements.ToPagedList(pageNumber, pageSize));
    }

    //
    // GET: /Announcement/Create

    public ActionResult Create()
    {
        Announcement announcement = new Announcement();

        return PartialView(announcement);       
    }

    //
    // POST: /Announcement/Create

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Announcement announcement)
    {
        if (ModelState.IsValid)
        {
            db.Announcements.Add(announcement);
            db.SaveChanges();
            return RedirectToAction("Index"); 
        } 

        return View(announcement);
    }

Index.cshtml

@model PagedList.IPagedList<Project.Models.Announcement>     
@using PagedList.Mvc;   
@using PagedList;

@using (Html.BeginForm())
{
    @Html.TextBox("SearchString", ViewBag.CurrentFilter as string, new { @class = "search-query", placeholder = "Search by name" })
    <input type="submit" value="Search" class="btn" />
}
@item.Title
@item.Type
@Html.Action("Create"); // This is the line causing errors after I submit the Create form.  Have tried changing to Html.RedirectAction

Create.cshtml:

@model Project.Models.Announcement

@using (Html.BeginForm())   
{
    @Html.AntiForgeryToken()

    @Html.TextBoxFor(model => model.Title, new { @style = "width:250px" })
    @Html.TextBoxFor(model => model.Type, new { @style = "width:250px" })

    <input type="submit" value="Create" class="btn btn-small" />        
}
0

1 Answer 1

2

After doing some testing locally...

You can keep

@Html.Action("Create")

However, you have to change one small thing. Define what action the POST points to in your form :)

@model Project.Models.Announcement

@using (Html.BeginForm("Create"))   
{
    @Html.AntiForgeryToken()

    @Html.TextBoxFor(model => model.Title, new { @style = "width:250px" })
    @Html.TextBoxFor(model => model.Type, new { @style = "width:250px" })

    <input type="submit" value="Create" class="btn btn-small" />        
}
Sign up to request clarification or add additional context in comments.

1 Comment

My next problem is now that a search form on the Index page is posting into my Create page - are you able to help with stackoverflow.com/questions/17390588/…?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.