2009-11-14 75 views
5

我試圖使用JQuery的$ .getJSON從控制器訪問模型數據,並在JavaScript中構建一個JSON對象以供用戶添加和刪除項目一個列表。所有JS都在一個外部文件中完成。模型數據的命中僅在頁面第一次加載後完成,因此我可以獲得用戶可供選擇的完整選項列表。之後,用戶可以根據需要修改列表(並相應更新JSON對象),然後將其保存(寫回到數據庫)。從外部Javascript文件訪問ASP.NET MVC模型數據

但是,這裏是我的問題:當使用$ .getJSON時,我需要在Controller中調用的方法需要一個ID,以便它可以查找我正在討論的特定資源並獲取相關選項的列表到那個特定的資源。但是從外部的JS文件中,我不知道如何讓該ID傳遞給Controller。它內置於首先打開頁面的鏈接中,並位於URL中,但一旦加載頁面,我不知道如何獲取此ID以便將其傳遞給Controller。我貼我的一些下面的代碼,因爲我知道這是令人困惑:

控制器中的詳細方法,最初加載頁面(需要RESOURCEID知道加載):

public ActionResult Details(string resId) 
{ 
    //call base method 
    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 
    ViewData.Model = eval; 
    return View("Index"); 
} 

在我外部JS文件,我這樣做:

$.getJSON("/Evaluation/PopulateJournalOptions/" + id, populateJSON); 

和Controller,我寫了被調用,以構建JSON對象的另一種方法叫做PopulateJournalOptions:

public JsonResult PopulateJournalOptions(string resId) 
{ 
    JournalOptionsResult jsonResult = new JournalOptionsResult(); 

    base.Details(resId, resourceType); 
    Evaluation eval = (Evaluation)this.Model; 

    jsonResult.Activities = eval.Journal.Activities; 
    jsonResult.Issues = eval.Journal.Issues; 
    jsonResult.ScheduledActions = eval.Journal.ScheduledActions; 

    return Json(jsonResult); 
} 

同樣,我的問題是,一旦頁面加載,我無法訪問我需要傳遞給PopulateJournalOptions的ID。我試過沒有給PopulateJournalOptions傳遞任何東西,然後在那裏創建一個新對象,並將其設置爲(Evaluation)this.Model,但this.Model似乎爲null,可能是因爲它是從JS調用的Controller的新實例。所以我有點卡在這裏。有任何想法嗎?

+0

我下面回答你的問題,我建議你獲得良好的MVC書(來自Apress)並閱讀關於請求生命週期的內容。 – 2009-11-14 21:36:33

回答

5

你有沒有想過把ID爲隱藏字段在頁面上,然後有:

ViewData["resouceID"] = resouceID; 

在負荷最初的視圖將這個你的JavaScript從字段中讀取ID?

$.getJSON("/Evaluation/PopulateJournalOptions/" + $('#Id').attr('value'), populateJSON); 

然後,在你看來,

<%= Html.Hidden("Id") %> 

隨着具有所需Id爲屬性模型

+0

我沒有想到,這當然是一個有趣的方法。儘管這很簡單,但我覺得這有點欺騙。這對其他人來說似乎是這樣嗎? – 2009-11-16 01:22:13

+0

我對這種方法的想法越多,聽起來就越乾淨,所以我繼續實施它。但不是.attr('value'),我需要使用.html()。否則,效果很好。感謝您的迴應! 作爲一個方面說明,我真的不喜歡我爲了構建這個JSON對象(一次加載頁面而另一次調用控制器操作返回JSON數據)打兩次服務器。如果我可以在加載頁面時將該JSON轉換爲外部JavaScript變量,而不必再次返回到服務器,那將會非常棒。 – 2009-11-16 01:36:43

+0

沒有理由不能將值放入模型中,然後將其寫入視圖中的JavaScript變量。使用AJAX回調會加快初始頁面加載速度,但是如果您可以承擔時間,則可以直接將其放入視圖中。 – tvanfosson 2009-11-16 02:32:29

0

控制器將這個:

<script> 
$(document).ready(function() { 
    $.getJSON("<%=Url.Action("YourActionName", "YourControllerName", new {id = ViewData["resouceID"]}) %>", populateJSON); 
}); 
</script> 
+0

嗨喬希,感謝您的快速回復。你能簡要解釋一下這是做什麼的嗎?看起來我可能還需要提供ID爲「yourID」。我已經使用提供給$ .getJSON的硬編碼ID測試了我的代碼,並且一切正常,所以我的Controller調用,回調,路由等工作正常,但我不知道如何讓ID傳遞給它。我可能會誤解你的答案,但看起來我仍然需要提供ID。此外,這將從外部的JS文件工作?再次感謝。 – 2009-11-14 21:51:07

+0

我編輯了我的答案以進一步解釋。 – 2009-11-14 22:25:15

+0

如果您最終需要從客戶端的頁面地址獲取標識,請查看查詢插件:http://plugins.jquery.com/project/query-object – 2009-11-14 22:27:40