我正在學習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中。我如何做到這一點?
另一個奇怪的是,如果我只是將數據庫查詢代碼複製到我的家庭控制器(它最初是在哪裏)強制原始查詢,那麼如果我把一些文本放入搜索字段並進行搜索,局部視圖自身在新頁面上呈現。爲什麼會發生這種情況,我認爲這隻會作爲我主頁的一部分。
我在一起,從不同的答案/地方鵝卵石這部分觀點,並沒有可怕的錯誤無疑得到的東西:\
等一下,「不通過控制器」是什麼意思?我很困惑,我有一個控制器用於我的部分視圖,並且它被調用,但只有當我搜索時...不在頁面加載。如何強制部分視圖控制器在頁面加載時被調用,以便部分視圖具有數據? – 2013-05-04 02:42:52
@EricSassaman,我更新了我的答案。希望能幫助到你。部分視圖,就像你一樣,在頁面首次加載時不會調用服務器。將會觸發的控制器操作取決於您如何進行路由設置。但是,由於您已經在表單標籤中定義了它,因此將在回發中調用搜索控制器。如果您將表單移動到您的部分視圖中,則可以更好地指定回發(例如,您可能需要不同的表單並在父頁面上回發)。 – 2013-05-04 22:52:16
固定!我的修補程序: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