Search code examples
asp.netasp.net-mvcpagemethodswebmethod

Correct way of adding Page Method to ASP MVC project?


I'm just getting started with ASP.NET and the MVC model. I've worked my around the basic concepts and have a few models, controllers, and views working fine. I know how to add Web Methods and Page Methods to a Web Service, but cannot figure it out for MVC projects.

I (think) I need to add a Page Method to my project as the correct way of responding to AJAX requests. This is what my controller looks like:

namespace MyProject
{
    public class OrderController : Controller
    {
        public ActionResult Place (ProductSku sku)
        {           
            var order = Order.NewOrder(sku);
            var db = new SystemDiscsLib.Database();
            db.SaveOrder(order);

            return View(order);
        }

        [WebMethod]
        public static string GetDate ()
        {
            return DateTime.Now.ToString();
        }

POSTing to /Order/Place works fine, and the view is created displaying the contents of Views/Order/Place.aspx and everyone is happy. However, any requests made to /Order/GetDate fail with a The resource cannot be found error. I (think) I have correctly enabled Page Methods by adding this to my Web.config, under system.web:

    <httpModules>
        <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </httpModules>

I do not have a view called GetDate as I don't want a view, I'll just be returning JSON data. I intend to use JQuery, so I didn't do the EnablePageMethods and ScripManager stuff, per this article.


Solution

  • PageMethods are for WebForms, not MVC. Change your method to look more like this:

    public JsonResult GetDate()
    {
      return Json(DateTime.Now.ToString());
    }
    

    Note that the method is no longer static, and you should not use the [WebMethod] attribute.