我正在学习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