只有在将页面设置为启动页面时,对MVC的Ajax调用才有效

时间:2014-02-03 08:26:17

标签: c# asp.net ajax asp.net-mvc-2

我对MVC很新,所以请忍受我明显的问题

我在VS2010中创建了一个简单的MVC2网站

我在控制器文件夹中添加了一个受控制的 控制器代码:

namespace MVC2TestApp.Controllers
{
    using MVC2TestApp.Models;
    public class PeopleController : Controller
    {
        //
        // GET: /People/

        public ActionResult Index()
        {
            return View();
        }
      //  [HttpPost]
        public ActionResult AddPeople(PeopleModel person)
        {
            return View("Index");
        }
        [HttpPost]
        public ActionResult Add(PeopleModel person)
        {
            return View("Index");
        }
    }
}

查看代码:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Index</h2>
    <button id="btnTest">Test</button>
    <script type="text/javascript">
        $(document).ready(function () {
            alert('ready got executed');
            $('#btnTest').click(function () {
               // debugger;
                try {
                    var person = { FirstName: "Joe", LastName: "Soap", Email: "a@b.c" };

                    alert(1);
                    $.ajax({
                        url: 'Add',
                        dataType: 'json',
                        data: person,
                        type: 'POST',
                        success: function (result) {
                            alert('step 3');
                            alert(result);
                        },
                        failure: function (result) {
                            alert('step 4');
                            alert(result);
                        }
                    });
                } catch (e) {
                    alert(e.responseText);
                } 

            });
        });
    </script>
</asp:Content>

People Controller:

namespace MVC2TestApp.Models
{
    public class PeopleModel
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email{get;set;}
    }
}

我通过在解决方案的属性中设置人物页面作为我的启动页面 - &gt;网络 - &gt;开始操作 - &gt;特定页面:人员\

这与预期一样,我在控制器中获取对象。

但是当启动页面设置为Home时,代码不会命中控制器。我不知道我做错了什么。

我尝试更改Global.asax中的RegisterRoutes方法。但这没有帮助。

Global.asax代码

namespace MVC2TestApp
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },// Parameter defaults
                new string[] { "MVC2TestApp.Controllers" }//This code was added to try to fix the problem
            );

        }

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterRoutes(RouteTable.Routes);
        }
    }
}

这是一个MVC2应用程序。我有VS2010专业版。

1 个答案:

答案 0 :(得分:0)

您可以在js中引用您的操作的完整路径。

您可以使用此方法(http://localhost:50000/People/Add)获取完整路径:

@Url.Action("Add", "People", null, Request.Url.Scheme, null)

那么你所在的页面无关紧要,你总是可以调用相同的动作,而且不会有相关网址的麻烦。

样品:

      $('#btnTest').click(function () {
           // debugger;
            try {
                var person = { FirstName: "Joe", LastName: "Soap", Email: "a@b.c" };
                var url = '@Url.Action("Add", "People", null, Request.Url.Scheme, null)';
                alert("Url: " + url);
                $.ajax({
                    url: url,
                    dataType: 'json',
                    data: person,
                    type: 'POST',
                    success: function (result) {
                        alert("Success!");
                        alert(result);
                    },
                    failure: function (result) {
                        alert("Fail!");
                        alert(result);
                    }
                });
            } catch (e) {
                alert(e.responseText);
            } 

        });