天天看點

Asp.Net MVC ajax調用 .net 類庫問題

如果你還在為 ajax 調用 .net 類庫還束手無策的話,相信這篇部落格将幫助你解決這個世紀問題!

因為Visual Studio 内置了asp.net mvc ,不過當你添加asp.net mvc項目時,你會發現,controller,model和views放在同一個根目錄下,

就像這樣:

圖一:

Asp.Net MVC ajax調用 .net 類庫問題

是以當我把根目錄下的controlelr,model删除,另建兩個類庫,controller,model這樣更友善操作,

如圖二:

Asp.Net MVC ajax調用 .net 類庫問題

因為是學習asp.net mvc,是以這樣的方式是根據《ASP.NET 設計模式》的,有興趣的朋友可以買來看看,非常好的一本書!

圖三:

Asp.Net MVC ajax調用 .net 類庫問題

雖然我這樣做的,但是出現了一個問題,就是view頁面裡的js(ajax url如何擷取controller裡的方法?)

書中給出了這樣的解決方法:

using System.Web;

namespace MyMvc4Project.Infrastructure.Helpers

{

    public class UrlHelper

    {

        public static string Resolve(string resource)

        {

            var url= string.Format("{0}://{1}{2}{3}",

                  HttpContext.Current.Request.Url.Scheme,

                  HttpContext.Current.Request.ServerVariables["HTTP_HOST"],

                  (HttpContext.Current.Request.ApplicationPath.Equals("/")) ?

                            string.Empty : HttpContext.Current.Request.ApplicationPath,

                  resource);

            return url;

        }

    }

}

然後在ajax的url中這樣引用:<%= Html.Resolve("/Home/GetProductsByAjax")%>

雖然這樣的确可以解決問題,但是,我說了但是,這個js必須放在html(也就是js的内置形式,如果放在外鍊的js中"<%%>"将不起作用),但這不是我們想要的,

做過項目的朋友知道,一般我們都是把js外鍊的!

是以,這種方法解決不了問題,當我開始思考這個問題時,我也走了很多彎路,不過終于讓我解決了這個問題,有兩種方法:

方法一:

在html中加這樣的代碼:

 <input id="hidd" type="hidden" value="<%= Html.Resolve("/Home/GetProductsByAjax")%>" />

這樣在外鍊的js中可以這樣調用:

$("#hidd").val() 給ajax的url;

方法二:

自己寫個js專門操作這樣方法,代碼如下:

var pathname = window.location.pathname;

var href = window.location.href;

var port = window.location.port;

var protocol = window.location.protocol;

var hash = window.location.hash;

var host = window.location.host;

function Resolve(url) {

    return protocol + "//" + host + ((pathname == "/") ? "" : pathname) + url;

外鍊的js可以這樣調用:

 myurl = Resolve('/Home/GetProductsByAjax');

雖然兩種方法都能夠解決問題,但是我更傾向于第二種方法,因為可讀性更強。

繼續閱讀