0

私の設定をできるだけ詳しく説明しようと思います。

1) エリア (MVC 4) を使用しています。フォルダーとファイルのセットアップは次のとおりです ここに画像の説明を入力 。2)デフォルトで、意図的に自分のエリア(ルートビューのホームコントローラーではない)に直接解決しています(この質問に関係のないホームコントローラーは本当に必要ありません。背景情報) 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 リクエスト 'Search/Member/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}"..私はデフォルト ルートの後にそれを持っていました。次に切り替えた原因は、それが常に明らかにデフォルト ルートに到達すると考えた..この場合、これは実際には最後の「キャッチオール」ルートである必要があります。

「Member/26049」など、getJSON からの URL のいくつかのバリエーションを試しました。

私のコントローラーのアクションは、セットアップの方法で問題ないと確信しています。

おそらくルートの問題であることはわかっていますが、それが何であるかはわかりません。

アップデート:

これがルートのデバッグ結果です

ここに画像の説明を入力

アップデート:

たぶんルートの問題だとずっと思っていたようですが、少なくとも今は大丈夫なので、このエラーが「リソース」によって何を意味するのかわかりません

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 にはいくつかの追加情報がありますが、コントローラー コードの何が問題なのか、それが問題である場合はまだわかりません。

[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");
    }

My Areaの登録ルート:

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)ビューに begin form タグがありません。これは、この $.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

これが応答の一部です。興味深いのは、コントローラーでルートがヒットしていることを示しているにもかかわらず、このエラーは「いいえ、コントローラーにヒットしていない」ということです。 :

HeadersResponseCacheHTML

リソースが見つかりません。body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin- top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font- size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: . 9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:太字; カラー:ネイビー; カーソル:手; }

<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

それはいつも愚かなことですよね?私はデバッグしたか、最終的にデバッグできました。何も見えませんでしたが、MemberAreaRegistrationの名前空間がエリア内のViewsフォルダーに配置されていることに気付きました。Area / Searchのルートに移動しましたが、名前空間がAreas.Searchに変更されたため、コントローラーが検出されているようです。

于 2012-10-28T04:45:13.017 に答える
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

Razor を使用できる場所に ajax リクエストの URL を保存し、@Url.Action(). これにより、有効なルートを確実に取得できます。たとえば、$.getがリンクをクリックした結果である場合、リンクの をViewhrefの結果に設定してから、 を実行します。後でルーティング構造を変更する場合にも役立ちます。JavaScript を検索して置換する必要はありません...@Url.Action()$.getJSON($(this).attr('href'), ...);

依頼例:

意見:

<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 に答える