0

AJAXテンプレートとJSONを使用して動的メニューをロードするMVCマスターページを設定しています-JSONは次の呼び出しで返されます:

var tabList = []; //これはコールバックのjsonデータを保持します

var getTabs = function () {
    $.getJSON('Home/TabList', null, function (json) {
        Sys.Observer.clear(tabList); 
        Sys.Observer.addRange(tabList, json); 
    });
}

if (tabList == '') { getTabs(); }

したがって、これはHomeControllerの関数を呼び出してJSONを返します。

   public JsonResult  TabList()
    {
            //get tabs
            ... //call code to get tabs - removed for ease of reading this question
            JsonResult jsonTabs = Json(tabItems);

            jsonTabs.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

            return jsonTabs;
        }
        catch (Exception ex)
        { throw ex; }

    }

これは、次のテンプレートで使用されます。

id = "tabTemplate" sys:attach = "dataview" class = "sys-template grid_16 topnav" dataview:data = "{{tabList}}"

アンカータグを使用してメニュー項目を作成する:

sys:href ="{{'/'+コントローラー+'/'+アクション+'/'}}"target = "_ top"

JSONオブジェクトのプロパティを使用してメニューテキストにデータを入力します。

{{文章}}

次に、このマスターページを2つの異なるMVCページに添付しました(「インデックス」と「バージョン情報」、およびglobal.asaxは「インデックス」に移動します)

したがって、これは最初にページにアクセスしたときにうまく機能し、メニューは正しく描画されますが、上記のテンプレートで生成された[ホーム/バージョン情報]リンクをクリックした[バージョン情報]メニュー項目をクリックすると、機能しなくなります。何が起こるかというと、javascriptが正しく呼び出されます(つまり、「getTabs」関数を呼び出してgetJSON呼び出しを通過します)が、実際にはコントローラーにヒットしてJSONを取得することはありません(コントローラーアクションにブレークポイントを設定します。この場合はヒットしません)。

私は完全に途方に暮れていて、これを何日も解決しようとしてきました。どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

2

.getJSONリクエストが相対パスを呼び出していることが原因である可能性がありますHome/TabList

http://localhost/たとえば、ホームページを表示しているとき、.getJSONリクエストはhttp://localhost/Home/TabList、あなたが言うように、これが機能することを呼び出します。

しかし、あなたが次のページにいるとき、例えばhttp://localhost/Home/About、あなたが言うように、.getJSONリクエストはhttp://localhost/Home/About/Home/TabListそれを呼び出しますが、それは機能しません:-)

とにかく、絶対パスを呼び出してみてください/Home/TabList

例えば

$.getJSON('/Home/TabList', null, function (json) {

注:最初の余分なスラッシュ。

HTH、
チャールズ

于 2009-12-17T00:41:58.427 に答える