TechnicalTophat
TechnicalTophat

Reputation: 1725

Action routing goes to same controller

I'm trying to link to a different controller with a HTTPPost action, however, when I try to it just appends my route values onto the current page's controller. For example, if I'm trying to link from Site/ViewIndex to Page/createPage with a form and a HTTPPOST, then it throws a 404 and says it can't access Site/Page/createPage. Why is it doing this and how can I stop it?

Here is my site/createPage:

public ActionResult createPage(int siteId, string title, string description, bool isBlog = false)
        {
            if (string.IsNullOrWhiteSpace(title) ||
                string.IsNullOrWhiteSpace(description))
            {
                return RedirectToAction("ViewIndex", new { siteId = siteId, message = "Please fill out all fields" });
            }
            try
            {
                Ops.PageOps.createPage(title, description, siteId, isBlog);
                return RedirectToAction("ViewIndex", "Site", new { siteId = siteId, message = "Page created!" });
            }
            catch (Exception e)
            {
                return RedirectToAction("ViewIndex", new { siteId = siteId, message = "Error occured: " + e.Message });
            }
        }

Here is my form:

<form method="post" action="Page/createPage">
    <input class="form-field form-control" type="text" name="title" placeholder="Page Title" />
    <input class="form-field form-control" type="text" name="description" placeholder="Page Description" />
    <input class="form-field form-control" type="hidden" name="siteId" value="@site.Id" />
    Blog page? <input class="form-field" type="checkbox" value="true" name="isBlog" /><br /><br />
    <input class="btn btn-info" type="submit" value="Create" /> 
</form>

And I doubt it's any relevance but here's my Site controller:

public class SiteController : Controller
    {
        /// <summary>
        /// The create page
        /// </summary>
        /// <returns></returns>
        public ActionResult CreateIndex()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Create(string title, string description, bool privateSite = false)
        {
            Ops.SiteOps.createSite(Authenticated.AuthenticatedAs, title, description, privateSite);

            return RedirectToAction("Index", "Home");
        }

        public ActionResult ViewIndex(int siteId, string message = null)
        {
            ViewBag.message = message;
            ViewBag.siteId = siteId;
            return View();
        }


    }

Upvotes: 0

Views: 21

Answers (1)

Shyju
Shyju

Reputation: 218762

Use the Html.BeginForm helper method to render your form tag. This will render the correct relative path to your HttpPost action in your form's action attribute.

@using(Html.BeginForm("CreatePage","Page"))
{
    <input class="form-field form-control" type="text" name="title" placeholder="Title" />
    <input class="form-field form-control" type="text" name="description" " />
    <input class="form-field form-control" type="hidden" name="siteId" value="@site.Id" />
    Blog page? <input class="form-field" type="checkbox" value="true" name="isBlog" />
    <input class="btn btn-info" type="submit" value="Create" /> 
}

Upvotes: 1

Related Questions