0

我将尝试尽可能详细地解释我的设置。

1)我正在使用一个区域(MVC 4)。这是文件夹和文件设置: 在此处输入图像描述 2)我默认直接解析到我的区域(不是根视图中的 Home 控制器)(我真的不需要与这个问题无关的 Home 控制器,只是一些背景信息) 3) 我的 global.asax 路由注册如下所示:

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

        RouteConfig.RegisterRoutes(RouteTable.Routes);

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

4)我的 route.config 看起来像这样:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    // Purposely not going to use the Home Controller (just a convention I want in place)
    routes.MapRoute("Default", "", new { area = "Search", controller = "Member", action = "Index", id = UrlParameter.Optional }).DataTokens.Add("area", "Search");
}

5)我所在地区的注册路由如下:

   public class MemberAreaRegistration : AreaRegistration
    {

        public override string AreaName
        {
            get { return "Search"; }
        }


        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute("Search_Member_GetMemberByContractNumber", "Search/Member/{id}", defaults: new { controller = "Member", action = "GetMemberByContractNumber", id = UrlParameter.Optional });
            context.MapRoute("Search_Default", "Search/{controller}/{action}/{id}", defaults: new { controller = "Member", action = "Index", id=UrlParameter.Optional});
        }

    }

6)我有一个执行此操作的控制器:

[HttpGet]
public JsonResult GetMemberByContractNumber(int contractNumber)
{
    Member memberDto = MemberCRUD.RetrieveMember(contractNumber);

    JsonResult member = Json(memberDto, JsonRequestBehavior.AllowGet);

    Json(JsonConvert.SerializeObject(member));

    return member;
} 

7) 我有一个试图向该操作发送 ajax 请求的视图:

// Get the results & Bind to grid
$(function () {
    var members = [];
    $.getJSON('Search/Member/26049', function (data) {
        members = data;
        grid = new Slick.Grid("#searchResults-Grid", members, columns, options);
    });
});

什么有效:我可以运行该站点,它会触发我的会员 Index() 操作并加载会员的索引视图。这不是这里的问题。

问题是什么:我无法解决这个问题......它在 jQuery getJSON 请求“搜索/成员/26049”中找不到我的控制器和操作

** 我在 FireBug 中遇到的错误**:

http://localhost/OurappName/Search/Member/26049 404 Not Found
        19ms
in the response:
<b> Requested URL: </b>/ballysearch/Search/Member/26049<br><br>

我试过的:最初在我所在地区的路线配置中,我在最后有第一行,所以尝试将它向上移动。我说的是 context.MapRoute("Search_Member_GetMemberByContractNumber", "Search/Member/{id}"..我在默认路线之后就有了。然后切换了,因为我认为它总是会明显达到我的默认路线..在这种情况下,这实际上应该只是最后的“包罗万象”路线。

我尝试了 getJSON 中 url 的几种变体,例如:'Member/26049'

很确定我的控制器的设置方式很好。

我知道这可能是路线问题,但我不明白它是什么。

更新:

这是路由调试结果

在此处输入图像描述

更新:

现在看起来也许我一直在想这是一个路线问题,但至少现在没关系,所以不确定这个错误的“资源”是什么意思

这是我现在似乎在我的 MemberAreaRegistration.cs 中工作的路线

在此处输入图像描述

context.MapRoute("Search_Member", "Search/Member/{contractNumber}", new { controller = "Member", action = "GetMemberByContractNumber", contractNumber = UrlParameter.Optional }); context.MapRoute("Search_Default", "Search/{controller}/{action}/{id}", new {controller="Member", action = "Index", id = UrlParameter.Optional });

现在不知道为什么我会收到此资源错误。在 Firebug 中,有一些附加信息,但如果是这种情况,我仍然不知道我的控制器代码有什么问题,或者如果这也是一个问题,我仍然不知道我的 jQuery 代码有什么问题......我没有看到:

[HttpException]: The controller for path &#39;/OurAppName/Search/Member/1234&#39; was not found or does not implement IController.

仍然对来自 firebug 的错误的更多看法:

在此处输入图像描述在此处输入图像描述

更新 -------------------------------------------------------- 2012 年 10 月 27 日:

想将我当前的尝试详细信息发布到这一点

我的路线在我的Route.Config中设置如下:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.IgnoreRoute("favicon.ico");
        routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });
        routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(css|js|gif|jpg)(/.*)?" });
        routes.IgnoreRoute("{*robotstxt}", new { robotstxt = @"(.*/)?robots.txt(/.*)?" });

        // Purposely not going to use the Home Controller, we don't need it so hence the DataTokens to tell MVC to go straight to my Area called Search to look for the member controller for the default route when you first hit the View
        routes.MapRoute("Default", "", new { area = "Search", controller = "Member", action = "Index", id = UrlParameter.Optional }).DataTokens.Add("area", "Search");
    }

我的区域的注册路线:

namespace OurApp.Web.Areas.Search.Views.Member
{
    public class MemberAreaRegistration : AreaRegistration
    {

        public override string AreaName
        {
            get { return "Search"; }
        }


        public override void RegisterArea(AreaRegistrationContext context)
        {


            context.MapRoute("Search_Member", "Search/Member/{contractNumber}", new { controller = "Member", action = "GetMemberByContractNumber", contractNumber = UrlParameter.Optional });
            context.MapRoute("Search_Default", "Search/{controller}/{action}/{id}", new {controller="Member", action = "Index", id = UrlParameter.Optional });
        }

    }
}

最后我的整个控制器代码:

namespace OurApp.Web.Areas.Search.Controllers
{

    public class MemberController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }


        [HttpGet]
        public JsonResult GetMemberByContractNumber(int contractNumber)
        {
            Member memberDto = MemberCRUD.RetrieveMember(contractNumber);

            JsonResult member = Json(memberDto, JsonRequestBehavior.AllowGet);

            return Json(member, JsonRequestBehavior.AllowGet);

            return member;
        }


        [HttpGet]
        public ActionResult TestTheRoute(int daveIdTest)
        {
            return null;
        }
    }
}

1)我的视图中没有开始表单标签。那是因为我只是想测试这个 $.ajax() 函数,稍后我将添加一个表单并从某个事件调用该调用。所以没关系,我还没有表单元素,对吧?我只是在我的视图顶部打开了 $.ajax 调用,因此它会自行触发。

2)正如您在上面看到的那样,它似乎可以到达我的路线。我只是想知道这是否是我在回调方面形成我的 $.ajax() 调用的方式,并且可能与我的控制器方法不完全正确有关?我正在从我的行动中返回 json,但我可以假设我拥有它。我不知道,除非我可以在返回 json 的操作方法中尝试不同的方法。我不知道我的 $.ajax 调用是否需要在回调中指定预期的返回类型,因为我只是在输入此内容时考虑过它,但我也会检查一下。

例如,当我像这样设置 $.ajax 调用时(见下文),我得到了回复,所以我认为这告诉我 IIS 能够在它到达我的路由和控制器后发送响应。所以我认为这是我的操作方法没有返回正确的 json 对象,不太确定,但在这一点上,如果来自 Phil Haack 的路由调试器显示它肯定会到达我的路由,那么它不可能是...... ajax 呼叫正在击中我的路线。

   $.ajax({
        url: 'OurApp/Search/Member/26049',
        type: "GET",
        dataType: "json",
        success: function (response) 
        {
            alert('we got a mother fing response!');
            grid = new Slick.Grid("#memberSearchResults-Grid", response.data, columns, options);
        },
        error: function (e) { alert('response error: '); }
    });

所以我收到了上面错误案例的警报,它正在命中这个。我不知道我是否总是会得到响应...可能我认为 IIS 会响应失败的请求和成功的路由请求...?

我尝试附加到工作进程,然后在该操作方法的第一行设置调试点后刷新页面,该操作方法在我的控制器中返回 json,但该行从未被命中。我不知道为什么。我无法获得任何调试点,不是

这是来自 firebug 的请求标头,仅供参考:

GET http://localhost/OurApp/Search/Member/26049 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Proxy-Connection: keep-alive

这是一些响应,有趣的是,即使它显示我的路线在我的控制器上被击中,这个错误说不,它没有击中你的控制器,所以我现在对 wtf 正在发生的事情以及在哪里感到目瞪口呆:

HeadersResponseCacheHTML

无法找到该资源。正文 {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-顶部:-5px} b {字体系列:“Verdana”;字体重量:粗体;颜色:黑色;边距顶部:-5px} H1 { 字体系列:“Verdana”;字体重量:正常;字体-大小:18pt;颜色:红色 } H2 { 字体系列:“Verdana”;字体重量:正常;字体大小:14 磅;颜色:栗色 } 前 {字体系列:“Lucida 控制台”;字体大小:。 9em} .marker {字体粗细:粗体;颜色:黑色;文本装饰:无;} .version {颜色:灰色;} .error {margin-bottom:10px;} .expandable { 文本装饰:下划线;字体粗细:粗体;颜色:海军蓝;光标:手;}

<body bgcolor="white">

        <span><H1>Server Error in '/OurApp' Application.<hr width=100% size=1 color=silver></H1>

        <h2> <i>The resource cannot be found.</i> </h2></span>

        <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">

        <b> Description: </b>HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable. &nbsp;Please review the following URL and make sure that it is spelled correctly.
        <br><br>

        <b> Requested URL: </b>/OurApp/Search/Member/26049<br><br>

        <hr width=100% size=1 color=silver>

        <b>Version Information:</b>&nbsp;Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272

        </font>

</body>

以及此请求的相关 mvc 路由调试器结果:

在此处输入图像描述

让我感到惊讶的是,它显示“路径的控制器'/OurApp/Search/Member/26049; 未找到或未实现 IController。” 但是如果路由调试说它正在被击中,wtf?我迷路了。同样,我无法调试它,所以它告诉我它没有击中我的控制器或控制器动作。

4

3 回答 3

0

您的操作是在寻找一个参数contractNumber,而不是id.

从此更改您的路线:

context.MapRoute("Search_Member_GetMemberByContractNumber", 
    "Search/Member/{id}", 
    defaults: new { 
        controller = "Member", 
        action = "GetMemberByContractNumber", 
        id = UrlParameter.Optional });

对此:

context.MapRoute("Search_Member_GetMemberByContractNumber", 
    "Search/Member/{contractNumber}", 
    defaults: new { 
        controller = "Member", 
        action = "GetMemberByContractNumber", 
        contractNumber = UrlParameter.Optional });
于 2012-10-26T18:48:04.717 回答
0

我建议将 ajax 请求的 URL 存储在可以使用 Razor 并使用@Url.Action(). 这将确保您获得有效的路线。例如,如果$.get是单击链接href的结果,我将链接的 设置为我的视图中的结果@Url.Action(),然后执行$.getJSON($(this).attr('href'), ...);. 如果您稍后更改路由结构,它也会有所帮助;您无需通过 JavaScript 搜索和替换...

请求示例:

看法:

<div data-search-url='@Url.Action("Index", "Member", new { area = "Search", id = 26049 })' id="whatever">...</div>

JavaScript:

var members = []; // Note that this will not be populated until $.getJSON returns
$(function () {
    $.getJSON($('#whatever').data('search-url'), function (data) {
        members = data;
        var grid = new Slick.Grid("#searchResults-Grid", members, columns, options);
    });
});
于 2012-10-26T19:06:29.950 回答
0

总是很愚蠢的事情对吧?我调试了或者终于可以调试了,单步执行。什么也没看到,但后来我注意到我的 MemberAreaRegistration 的命名空间被放置在我区域内的 Views 文件夹中。我将它移到 Area/Search 的根目录,现在它似乎正在找到我的控制器,因为名称空间现在更改为 Areas.Search

于 2012-10-28T04:45:13.017 回答