Routing a custom controller in Orchard CMS
asp.net-mvc-3, asp.net-mvc-routing, orchardcms
Solution
Try this:
@using (Html.BeginForm("Send", "Email", new { area = "Your.Module" }, FormMethod.Post, new { id = "contactUsForm" }))
Adding the area is like an extra clause that ensures only your module is searched for a matching controller/action method pair.
Problem
I'm having some trouble setting up the routing to a custom controller in Orchard. I've created a View: ``` @model dynamic @{ Script.Require("jQuery"); } @using (Html.BeginForm("Send", "Email", FormMethod.Post, new { id = "contactUsForm" })) { <fieldset> <legend>Contact Us</legend> <div class="editor-label">Name:</div> <div class="editor-field"> @Html.TextBox("Name", "", new {style = "width: 200px"}) </div> <div class="editor-label">Email Address:</div> <div class="editor-field"> @Html.TextBox("Email", "", new {style = "width: 200px"}) </div> <div class="editor-label">Telephone Number:</div> <div class="editor-field"> @Html.TextBox("Telephone", "", new {style = "width: 200px"}) </div> <div class="editor-label">Message:</div> <div class="editor-field"> @Html.TextArea("Message", "", new {style = "width: 200px"}) </div> <br/> <input id="ContactUsSend" type="button" value="Submit" /> </fieldset> } @using (Script.Foot()) { <script> $(function() { $('#ContactUsSend').click(function () { alert('@Url.Action("Send", "Email")'); var formData = $("#contactUsForm").serializeArray(); $.ajax({ type: "POST", url: '@Url.Action("Send", "Email")', data: formData, dataType: "json", success: function (data) { alert(data); } }); }); }); </script> } ``` With a Controller: ``` public class EmailController : Controller { [HttpPost] public ActionResult Send() { var orchardServices = DependencyResolver.Current.GetService<IOrchardServices>(); var messageHandler = DependencyResolver.Current.GetService<IMessageManager>(); var svc = new ContactUsService(orchardServices, messageHandler); svc.DoSomething(); return new EmptyResult(); } } ``` And setup the route: ``` public class Routes : IRouteProvider { public void GetRoutes(ICollection<RouteDescriptor> routes) { foreach (var routeDescriptor in GetRoutes()) { routes.Add(routeDescriptor); } } public IEnumerable<RouteDescriptor> GetRoutes() { return new[] { new RouteDescriptor { Priority = 15, Route = new Route( "ContactUsWidget", new RouteValueDictionary { {"area", "ContactUsWidget"}, {"controller", "Email"}, {"action", "Send"} }, new RouteValueDictionary(), new RouteValueDictionary { {"area", "ContactUsWidget"} }, new MvcRouteHandler()) } }; } } ``` But when I click the submit button, it tries to post to OrchardLocal/Contents/Email/Send and obviously fails. Can anyone point me in the direction of what I'm doing wrong?