[英]Formatting of JavaScript for MVC3 views
我已經嘗試了許多不同的方法來組織現在特定於每個View的JavaScript,但我還沒有找到任何我覺得舒服的方法。 無論如何它似乎很亂。 可能(並且希望)因為我沒有使用JavaScript很長時間,並且有一種很好的方法可以做到這一點。
目前我正在做的是:
在我的布局文件中,除了RenderBody之外,我還有腳本的RenderSection。 本節包含與每個視圖相關的所有JavaScript。 全局腳本隱藏在它自己的文件中。
在這一部分中有很多不同的JavaScript部分(對於我最大的View,目前大約有600行JavaScript):
我不喜歡的東西主要有兩件事:
@Url.Action('...')
將其鏈接到正確的操作方法,以確保即使我更改路由,我的腳本也會繼續工作。 我也使用模型來決定某些元素是否應該隱藏起來或者不是這樣(這是一個讓它開始隱藏的好方法,還是有更好的方法?即使我不能把它看起來有點hacky我的手指): 碼
@if( Model.SomeBoolValue ){
@:$("#DOMelementID").hide();
}
一些指示讓我走向正確的方向將受到高度贊賞。 在失去對自己代碼的控制權之前,我需要更好地構建這個結構。
是的,它會變得艱難。
這是我們的工作,並為我們工作 (以粗體顯示,因為它可能對您不起作用)。
對於每個View /頁面,我們計算出JavaScript需要哪些模型屬性才能做出決策(也就是“邏輯”)。
我們在JavaScript的布局中也有一個部分。
然后我們在View /頁面中設置一個JavaScript屬性,封裝這些屬性,如下所示:
@section JavaScript {
<script type="text/javascript">
yn.yp = {
someBoolValue: @Model.SomeBoolValue,
someOtheProp: '@Model.SomeOtherProp'
}
</script>
}
yn
=您的命名空間,為您的項目/公司綁定全局命名空間。 yp
=您為其設置JS屬性的頁面。
然后在您的外部JS文件中:
$(function() {
if (yn.yp.someBoolValue) {
$("#elementid").hide();
}
});
這也是處理客戶端AJAX使用的路由URL的一種非常簡潔的方法 。 設置像yn.yp.urls
這樣的屬性,並在View中設置URL,然后JS可以輕松訪問它們而無需任何硬編碼。
總的來說,這里的目標是減少嵌入式頁面JavaScript中的服務器端代碼。
設置JS需要做出決策的屬性,然后讓JS自己做出決策。
希望有道理。
我建議你看看jQuery插件創作,並根據你將附加到DOM元素的插件組織你的javascript代碼。
就@Url.Action('...')
問題而言,有許多方法可以解決此問題並將腳本外部化為單獨的文件。 例如,假設您正在AJAX化現有表單或已包含url的ActionLink:
$('#myAnchor').click(function() {
// use this.href to fetch the url
$.post(this.href, function(result) {
});
return false;
});
現在,如果您只是想在用戶點擊div時發送一個AJAX請求,那么您總是可以使用HTML5 data- *屬性(與ASP.NET MVC 3不引人注目的AJAX和驗證工作方式相同)來定義此URL DOM元素:
<div id="mydiv" data-url="@Url.Action("Some Action")">click me</div>
現在在一個單獨的文件中
$('#mydiv').click(function() {
var url = $(this).data('url');
$.post(url, function(result) {
});
});
如果您按照我關於編寫jQuery插件的第一個建議,您的代碼將如下所示:
$('#mydiv').myplugin();
現在讓我們考慮以下代碼段:
@if(Model.SomeBoolValue) {
@:$("#DOMelementID").hide();
}
因此,從這里看來,您正在使用視圖模型屬性來顯示/隱藏代碼的各個部分。 好的,這就是我建議您:JSON將此模型序列化到視圖中,然后您可以開始將值傳遞給新開發的jQuery插件:
<script type="text/javascript">
var model = @Html.Raw(Json.Serialize(Model));
// now configure configure your plugins, for example
$('#mysection').myplugin({ model: model });
</script>
現在,在您的插件中,您將可以訪問視圖模型的絕對所有屬性。
這就是你需要在你的觀點中提出的所有內容。 所有其他的javascript當然會在單獨的javascript文件中,在可重用的jQuery插件中正確組織。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.