我在使用PartialViews和Ajax.I时遇到了一个问题,我想要一个基于类别选择的搜索,并在局部视图中呈现结果列表。
问题是,当我单击搜索按钮时,它会在targetDiv中呈现相同的页面,而不是它应该加载的PartialView。
以下是我的代码
@model IPagedList<MvcApplication1.Models.Tender>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")"
type="text/javascript"></script>
<div id="search-section" class="container">
@using (Ajax.BeginForm(new AjaxOptions
{
HttpMethod = "get",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "search_result"
}))
{
<div class="grid4 a-left first">
<label for="regularInput">Search Tenders:</label>
</div>
<div class="searchtext a-right">
@Html.DropDownList("SearchCatagory", (SelectList)ViewBag.DropDownValues)
@Html.TextBox("SearchBox", "Type your search key here.")
<button type="submit">GO</button>
</div>
}
</div>
@Html.Partial("_SideViewLeft")
@Html.Partial("_SearchResult", Model)
发布于 2014-05-25 18:26:04
在你的局部视图中,将这一行添加到它的顶部,因为你的局部视图使用它的主布局呈现为一个普通视图:
@{
Layout = null;
}
发布于 2014-05-25 18:31:56
它不假定加载partialView..Can仅用于更新html中的目标元素。因此,您必须在控制器中调用一个操作,该操作将获取与部分视图一起返回的搜索结果。
发布于 2014-05-25 21:25:33
您没有指定您的控制器代码或局部视图,因此这只是一个小小的猜测。您需要将部分页面作为接收表单发布的控制器操作的结果返回。
正如您所指定的:
Ajax.BeginForm(new AjaxOptions
它会返回到它所在的同一页面,而不是另一个局部视图。这将返回整个页面并将其插入到指定的#search_result
元素中。
有几个解决方案可以解决这个问题。
1)改为发布到特定的操作
Ajax.BeginForm("SearchAction", new AjaxOptions
然后,控制器中的searchAction
方法可以检查post是否有效,并返回searchAction
PartialView。
2)检测请求是否来自Ajax
然后,您可以根据使用情况返回整个页面或部分页面。
if (Request.IsAjaxRequest())
{
ViewBag.Layout = null
}
else
{
ViewBag.Layout = "~/Views/Shared/_layout.cshtml";
}
return View();
只需确保您的页面包含:
@{
Layout = ViewBag.Layout;
}
然后,它可以有条件地呈现为部分视图或完整视图。
https://stackoverflow.com/questions/23858526
复制