2013-05-04 38 views
1

我正在學習MVC,並被此難住。我試圖將一些獲取數據並將其顯示在WebGrid中的常見代碼分解爲可在多個頁面上使用的局部視圖。MVC與控制器,ajax局部視圖 - 我如何ge局部控制器獲取數據?

我的家庭控制器索引方法只是做一個返回視圖()。主頁視圖看起來是這樣的:

@using (Ajax.BeginForm("SearchAction", "Search", 
    new AjaxOptions { UpdateTargetId = "data-grid", HttpMethod = "Post" })) 
{ 
    @Html.TextBoxFor(model => model.name) 
    <input type="submit" value="Search" /> 
} 

@{ 
<div id="data-grid"> 
    @Html.Partial("SearchResults", Model) 
</div> 
} 

我試圖使用Ajax,以避免點擊的WebGrid尋呼機鏈接,呈現爲正常的鏈接時,失去我的搜索表單數據。

我SearchController看起來是這樣的:

public ActionResult SearchAction(string name) 
{ 
    return RedirectToAction("SearchResults", new { name = name }); 
} 

public ActionResult SearchResults(string name) 
{ 
    //does database query and sticks results in the viewbag 
    //filter on optional name parameter 

    VieweBag.Members = MyQueryResults; 
    return PartialView(); 
} 

我SearchResult所認同的觀點,數據通過ViewBag.Members傳遞:

@{ 
    var grid = new WebGrid(null, rowsPerPage: ViewBag.Pagesize); 
    grid.Bind(ViewBag.Members); 
    @grid.GetHtml(// etc. etc.) 
} 

我得到的結果是,ViewBag.Pagesize並且ViewBag.Members綁定失敗,因爲viewbag中沒有數據。顯然,我的部分控制器沒有被調用來執行初始查詢,並在首頁加載時將東西放入ViewBag中。我如何做到這一點?

另一個奇怪的是,如果我只是將數據庫查詢代碼複製到我的家庭控制器(它最初是在哪裏)強制原始查詢,那麼如果我把一些文本放入搜索字段並進行搜索,局部視圖自身在新頁面上呈現。爲什麼會發生這種情況,我認爲這隻會作爲我主頁的一部分。

我在一起,從不同的答案/地方鵝卵石這部分觀點,並沒有可怕的錯誤無疑得到的東西:\

回答

2

的部分頁面不會通過控制器,而只是直接渲染視圖。如果您想將視圖數據傳遞給分部視圖,那麼需要一個重載函數來獲取viewdata字典。對不起,我不能更詳細的,但我對我的手機(等待我的兒子在另一個房間裏睡着了):)

更新:

如果你想觸發一個GET您的局部視圖操作,您可以使用Html.Action。下面是一些有用的鏈接:

此外,它很可能會令你感覺你的表單標籤進入你的部分觀點,但這些都是當你清潔細節代碼。

+0

等一下,「不通過控制器」是什麼意思?我很困惑,我有一個控制器用於我的部分視圖,並且它被調用,但只有當我搜索時...不在頁面加載。如何強制部分視圖控制器在頁面加載時被調用,以便部分視圖具有數據? – 2013-05-04 02:42:52

+0

@EricSassaman,我更新了我的答案。希望能幫助到你。部分視圖,就像你一樣,在頁面首次加載時不會調用服務器。將會觸發的控制器操作取決於您如何進行路由設置。但是,由於您已經在表單標籤中定義了它,因此將在回發中調用搜索控制器。如果您將表單移動到您的部分視圖中,則可以更好地指定回發(例如,您可能需要不同的表單並在父頁面上回發)。 – 2013-05-04 22:52:16

+1

固定!我的修補程序:1)包括jquery.unobtrusive-ajax.js - 這固定在單獨的頁面上呈現。 2)用@ Html.Action(「SearchResults」,「Search」)替換@ Html.Partial,這個頁面加載時加載網格(謝謝!!)3)在搜索控制器中刪除無用的SearchAction()4)設置HttpMethod = Ajax.BeginForm中的「GET」AjaxOptions(doh!)。我的表單輸入ID和我的搜索控制器參數之間也有不匹配。此外,在全天閱讀狂歡期間,對於「Pro ASP.NET MVC 4」這本書提供了一些重要線索。 – 2013-05-05 01:41:14

0

Jonass是對的,ViewBag只在Controller和View之間傳播。

您可以做的一件事就是使局部視圖的模型與您放入ViewBag的數據類型相同。

因此,如果例如您MyQueryResults的類型爲:

IEnumerable<Result> 

在你的部分觀點,你要補充

@Model IEnumerable<Result> 

然後在主視圖中,你會使其通過渲染方法:

@Html.Partial("SearchResults", ViewBag.Members); 

你需要稍微調整一下,以確保它是正確的類型,但這應該做訣竅。

祝你好運!

+0

嗯問題是,我的SearchResults控制器只是永遠不會在頁面加載時被調用。只有我的主頁控制器。我嘗試了你的建議修改,當我在分部視圖控制器(SearchController)中放置一個斷點時,它在頁面加載時從不打它。所以我的模型在我的部分視圖中是空的。我是否需要在兩個控制器中複製我的db查詢代碼?完全擊敗了我在這裏嘗試做的目的...... – 2013-05-04 02:35:33

相關問題