2013-05-04 84 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

相关问题