我正在学习MVC,并对此感到难过。我试图考虑一些获取数据的常用代码,并将它在WebGrid中显示为可以在多个页面上使用的部分视图。
我的家庭控制器Index方法只返回View()。 Home视图如下所示:
@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();
}
我的SearchResults共享视图,数据通过ViewBag.Members传递:
@{
var grid = new WebGrid(null, rowsPerPage: ViewBag.Pagesize);
grid.Bind(ViewBag.Members);
@grid.GetHtml(// etc. etc.)
}
我得到的结果是ViewBag.Pagesize和ViewBag.Members绑定失败,因为viewbag中没有数据。显然,我的部分控制器没有被调用来执行初始查询,并在首次加载主页时将内容放入ViewBag中。我该如何做到这一点?
另一个奇怪的事情是,如果我只是将数据库查询代码复制到我的家庭控制器(它最初的位置)来强制原始查询,那么如果我将一些文本放入搜索字段并进行搜索,那么视图在新页面上自行呈现。为什么会发生这种情况,我认为它只会作为我主页的一部分呈现。
我从各种答案/地方拼凑了这个局部视图,毫无疑问得到了一些可怕的错误:\
答案 0 :(得分:2)
部分页面不会通过控制器,而只是直接渲染视图。如果要将视图数据传递给局部视图,则会有一个带有viewdata字典的重载函数。对不起,我不能更详细,但我在我的手机上(等待我的儿子在另一个房间里睡着了):)
<强>更新强>
如果您想为部分视图触发GET
操作,可以使用Html.Action
。以下是一些有用的链接:
此外,将表单标记移动到局部视图中可能是有意义的,但这些是清理代码时的详细信息。
答案 1 :(得分:0)
Jonass是对的,ViewBag只在Controller和View之间传播。
您可以做的一件事是使局部视图的模型与您放入ViewBag的数据类型相同。
因此,例如,如果你的MyQueryResults是类型:
IEnumerable<Result>
在部分视图中,您需要添加
@Model IEnumerable<Result>
然后在主视图中,您将通过Render方法传递它:
@Html.Partial("SearchResults", ViewBag.Members);
你需要稍微调整一下以确保它是正确的类型,但这应该可以解决问题。
祝你好运!