1

我正在学习 MVC,对此我感到很困惑。我正在尝试将一些获取数据并将其显示在 WebGrid 中的通用代码分解为可以在多个页面上使用的局部视图。

我的家庭控制器 Index 方法只是返回 View()。主页视图如下所示:

@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 中。我该如何做到这一点?

另一个奇怪的事情是,如果我只是将数据库查询代码复制到我的主控制器(它原来所在的位置)以强制执行原始查询,那么如果我将一些文本放入搜索字段并进行搜索,则部分视图呈现为自己在一个新的页面上。为什么会这样,我认为它只会呈现为我主页的一部分。

我从各种答案/地方拼凑出这个部分观点,毫无疑问,我遇到了可怕的错误:\

4

2 回答 2

2

部分页面不会通过控制器,而是直接渲染视图。如果要将视图数据传递给局部视图,则有一个采用 viewdata 字典的重载函数。对不起,我不能更详细,但我在手机上(等我儿子在另一个房间睡着):)

更新:

如果要GET为局部视图触发操作,可以使用Html.Action. 以下是一些有用的链接:

此外,将表单标签移动到局部视图中可能对您来说是有意义的,但这些是您清理代码时的详细信息。

于 2013-05-04T01:17:39.767 回答
0

Jonass 是对的,ViewBag 只在 Controller 和 View 之间传播。

您可以做的一件事是使局部视图的模型与您放入 ViewBag 的数据类型相同。

因此,例如,如果您的 MyQueryResults 是以下类型:

IEnumerable<Result>

在您的局部视图中,您将添加

@Model IEnumerable<Result>

然后在主视图中,您将通过 Render 方法传递它:

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

您需要稍微调整一下以确保它是正确的类型,但这应该可以解决问题。

祝你好运!

于 2013-05-04T01:40:32.913 回答