2014-01-27 39 views
13

我正在使用剃鬚刀處理asp.net .NET mvc項目。JavaScript中的訪問模型.asm mvc razor

我試圖使用在JavaScript中我的模型如下

 
alert(Model.SecurityProfile); 
alert(model.SecurityProfile); 
alert(@Model.SecurityProfile); 
alert(@model.SecurityProfile);

var SecurityProfileViewModel = { ViewModel: model, Id: SecurityProfileId, ProfileId: $('#ProfileId').val(), JobTitleId: $('#JobTitle').val(), SecurityProfileTypeId: $('#SecurityProfileType').val(), Status: $('#ddlStatus').val(), Reason: $('#txtReason').val(), Mode: $('#hidMode').val() };

$.ajax({ 
     url: '/SecurityProfile/Edit', 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: JSON.stringify(SecurityProfileViewModel), 
     success: function (data) { 
      alert(data); 
      window.location.href = '/SecurityProfile/Index'; 

     } 
    }); 

但沒有任何工程。我得到的模型是未定義的錯誤

+0

我已經在這裏詳細解釋了這個http://stackoverflow.com/a/41312348/2592042 –

回答

40

model是未定義的,就JavaScript而言。視圖中的服務器端代碼在服務器端執行。 JavaScript沒有這個概念。它只關心該代碼的客戶端輸出。你可以將類型的混合使用,但需要記住,服務器端組件只是在那裏發出字符串,這些字符串將成爲客戶端輸出的一部分。

因此,舉例來說,如果你有叫上你的模型屬性:

Model.SomeProperty 

那麼你不能直接在JavaScript中使用這樣的:

alert(Model.SomeProperty) 
// or 
alert(SomeProperty) 

那不是使用razor視圖語法來告訴視圖引擎這裏有服務器端代碼。這是語法上的客戶端代碼,並且沒有客戶端。所以,你需要表明,有服務器端預處理做:

alert(@Model.SomeProperty) 

此外,如果SomeProperty是一個字符串,那麼請記住,這是輸出不會包含引號。所以,你需要提供那些客戶端代碼:

alert('@Model.SomeProperty') 

因此,SomeProperty服務器端值將出現在這裏它呈現給客戶發出的。因此,如果值是一樣的東西"Hello World"然後將得到的客戶端代碼將是:

alert('Hello World') 

最主要的是要記住服務器端代碼和客戶端代碼之間的距離。就服務器端代碼而言,所有JavaScript/HTML/CSS都只是一個大字符串。該視圖基本上只是創建一個大字符串發送到瀏覽器。一旦它在瀏覽器中,客戶端渲染知道JavaScript/HTML/CSS之間的區別,並在服務器端代碼消失很久之後執行相應的操作。

+0

我明白你的觀點。它完美的作品。感謝那。現在,如果我想將模型(對象的實例)本身分配給ajax調用的data:部分,爲了訪問控制器的action方法參數中的相同內容,我該怎麼做? – SARAVAN

+0

@SARAVAN:目前還不清楚你的意思。 AJAX調用就像任何頁面加載一樣是一個請求/響應。本質上,您需要在調用中提供數據(例如在包含來自客戶端的模型字段的POST中)或從數據庫持久性中提取模型的數據(例如,如果POST僅包含ID和模型需要僅基於該ID來構建服務器端)。 – David

相關問題