2014-06-16 184 views
2

我一直在使用剃刀仿製系統,但遇到了一致的語法錯誤。在我的許多.cshtml文件中,我在一行代碼中多次交換.cs和.js,導致intellisense感到困惑。剃刀召集

<script type="text/javascript" id="dtscript"> 
///... 
@if (!string.IsNullOrWhiteSpace(ColumnDefs)) 
{ 
    @:columnDefs: @model.ColumnDefs, 
} 
///... 
</script> 

在上述線@ColumnDefs後的尾部逗號是一個語法錯誤,然而當.cshtml文件編譯和我呈現模板呈現的代碼是正確的。用於生成代碼的替代方式這一語法錯誤持有...

@if (!string.IsNullOrWhiteSpace(ColumnOrder)) 
{ 
    <text>order: @model.ColumnOrder</text>, 
} 
//or 
@if (!string.IsNullOrWhiteSpace(ColumnOrder)) 
{ 
    <text>order: @model.ColumnOrder,</text> 
} 

因爲模板生成正確的觀點我一直對解決語法錯誤慢,但我厭倦了所有的紅色波浪線的。所以我的問題是拼接.cs和.js的正確方法是避免在整個剃刀文件中錯誤地報告語法錯誤。

更新: 讓我稍微展開這個場景。沒有控制器,這個系統是一個獨立的庫。模板系統是產品不可知的,並且是通用插件的域特定語言的一部分。 @ model.ColumnDefs實際上是一個呈現爲以下代碼的json對象。

columnDefs: [{"sortable":false,"targets":[0,3]}, 
    {"visible":false,"targets":[0,7]}, 
    {"searchable":false,"targets":[0]}, 
    {"name":"Id","targets":0}, 
    {"name":"Email","targets":1}, 
    {"name":"Name","targets":2}, 
    {"name":"IsAdmin","targets":3}, 
    {"name":"Salary","targets":4}, 
    {"name":"Position","targets":5}, 
    {"name":"Hired","targets":6}, 
    {"name":"Number","targets":7}], 

它不能被包裹在「」或「'中,否則插件無法解析代碼。

+3

簡單的答案 - 不要混入你的JavaScript到你的剃鬚刀!這隻會讓你的代碼難以維護。相反,創建一個JSON對象並從'GET'請求中返回它,在你的JavaScript中使用它。 – Ian

+0

儘管我同意你的回答,但伊恩這種方法是我能夠提出的唯一符合我們要求的方法。我在後臺使用JSON對象,但由於生成的代碼是基於使用情況的動態代碼,因此我沒有靜態代碼可供依賴。用戶在其視圖中定義模式(通過流暢配置的漸進式界面),並且該庫返回呈現的.js代碼。 – Siegeon

+0

在繼續沿着這條路線前花點時間思考,看看能不能重構它 – Ian

回答

0

您應該將大部分邏輯移至控制器。這意味着該行:

@if (!string.IsNullOrWhiteSpace(ColumnOrder)) 

應在控制器內:

if(!string.IsNullOrWhiteSpace(ColumnOrder)) ViewBag.Something = ...; 

在剃刀,開始您的理想狀態,如JavaScript變量:

var something = "@ViewBag.Something"; //this is a javascript line 

以我的經驗,Visual Studio的智能感知在這種情況下正確工作,並將@ViewBag.Something識別爲剃刀語法(但注意雙引號,它們屬於包含字符串值的javascript)。

+0

「@ ViewBag.Something」在生成的代碼中添加了破解代碼,即封裝「」請參閱我的更新以瞭解正在生成的內容的示例。 – Siegeon