2014-01-18 16 views
0

在討論this question的評論之後,它對我感到好奇 - 在JavaScript塊中使用Url.Action來使用RouteConfig中定義的相同路由而不是手動硬編碼URL是否是一種很好的做法?它違反了MVC關於分離的思想嗎?在Html Javascript塊中使用Url.Action是MVC未來的良好做法嗎?

例如,如果我有一些針對一些JavaScript代碼塊:

<script type="text/javascript"> 

    function validateName(objName){ 
     $.ajax({ 
      url: '@Url.Action("ValidateName", "Signup")', 
      data: objName, 
      sucess: function(result){ 
       if (result == someGoodValue){ 
        window.location = '@Url.Action("NextStep", "Signup")'; 
       } else { 
        alert("Invalid name"); 
       } 
      } 
     }); 
    } 

</script> 

它是一個很好的做法在這樣的塊使用Url.Action?

UPDATE

我主要擔心的是,如果我們硬編碼的HTML網址,JavaScript文件,那麼如果路由名稱改變了,它被轉移到區等,那麼我們就需要手動更換所有硬編碼的網址,這有點痛苦。

+1

我當然相信使用Url.Action而不是手動使用硬編碼的URL? – Satpal

回答

0

我一直在爲世界各地的電影製作人開發應用程序。我會坦率地告訴你。用您的JavaScript混合MVC(Razor/ASP)視圖代碼並不是一個好主意。你要做的最後一件事就是要避免MVC重點關注的分離。

以下是支持我的索賠的優勢:
1)。如果你從HTML中分離出所有的JavaScript。多個開發人員可以同時處理它們兩個(MVC希望提供的優勢)。
2)。如果你把所有的JavaScript放在一個單獨的文件中。您可以將它們緩存在客戶端的瀏覽器上,從而以更快的網頁加載時間(http://mobile.smashingmagazine.com/2013/04/03/build-fast-loading-mobile-website/
3)。您還可以縮小JavaScript文件,這也會導致更快的加載時間。

順便說一句,您可以使用隱藏字段來存儲目標網址及其參數(在JSON格式)。所以你可以訪問他們在你的JavaScript如果你需要避免硬編碼。真正糟糕的是將JavaScript與VIEW(ASPX/RAZOR)代碼混合在一起。

+0

是的,同意。但是我們可以使用不同的方法根據路由生成帶有Url的Javascript文件,並使用它從外部的javascript:像T4MvcJs - http:// t4mvcjs。codeplex.com/SourceControl/latest#MvcApplication/Scripts/T4MvcJs/T4MvcJs.js或一些自定義方法,如 - http://weblogs.asp.net/zowens/archive/2010/12/20/asp-net-mvc-javascript -routing.aspx。所以我的主要想法是,硬編碼的url不應該出現在Html \ Javascript文件中,但是應該根據路由生成這個url。 –

+0

是的,我們可以使用不同的方法。但爲什麼不選擇更具優勢的那個呢?網站是一個非常具有競爭力的市場,您需要從最適合您的可用解決方案中獲得最好的結果,以在這個競爭性業務中生存下來。 –

+0

我在url硬編碼中沒有得到什麼優勢......這不是關於使用相同的視圖,我們也可以使用外部Javascript文件,但我們不需要對該URL進行硬編碼。如果我們想在單獨的文件中使用它們,那麼我們可以在View \ generated javascript文件中生成這些url,所以它不會影響性能,並且會被瀏覽器緩存。 –

2

我同意@Allan Chua與混合剃鬚刀應用級 javascript是一個壞主意。

但是,您可以有單獨的JavaScript文件,由剃鬚刀渲染,設置您的應用程序級JavaScript可以使用的JavaScript變量。例如:

JavaScriptRoutes.cshtml

var routes = routes || {}; 
routes.signup = routes.signup || {}; 
routes.signup.validateName = '@Url.Action("ValidateName", "Signup")'; 
routes.signup.nextStep = '@Url.Action("NextStep", "Signup")'; 

用法:

<script> 
    @{ Html.RenderPartial("JavaScriptRoutes"); } 
</script> 

<script type="text/javascript"> 

    function validateName(objName){ 
     $.ajax({ 
      url: routes.signup.validateName, 
      data: objName, 
      sucess: function(result){ 
       if (result == someGoodValue){ 
        window.location = routes.signup.nextStep; 
       } else { 
        alert("Invalid name"); 
       } 
      } 
     }); 
    } 

</script> 

這並不意味着你不能捆綁與應用程序的JavaScript剃刀生成的JavaScript。儘管我們儘可能快地使用RenderPartial在視圖中加載它。現在您的應用程序級JavaScript可以從剃刀文件移出到外部.js文件中,因爲它根本不依賴剃鬚刀。當您的路由在服務器上發生變化時,URL將自動更改,無需對其進行硬編碼。

+0

是的,正是我在談論的。我們可以將路由URL移動到專門生成的JavaScript文件,因此我們可以使用生成的常量,而不是硬編碼的URL。因此,當我們更改Route時,此代碼將生成更新URL,並且我們無需修復整個項目中的所有Url –

+0

但是,您仍然不希望在***應用程序塊中擁有依賴關係*** 。使應用程序塊使用由剃鬚刀生成的變量。我也會對T4MvcJs讚不絕口。我試過了,從不喜歡它。 – danludwig

+0

感謝您與我同意@danludwig。爲你+1我的朋友。 –