目的
我有一个列出名称的简单表(在部分视图中),上面是一个包含这些名称的下拉列表。目的是根据下拉列表中选择的名称过滤表。一旦下拉列表中的选定值发生更改,就应该立即进行过滤,并且应该仅再次呈现部分视图。
问题
当我在下拉列表中选择一个值时,部分视图不会在另一个视图中呈现,而是显示为整个页面。 但是,当我在我的Ajax.BeginForm块中包含一个提交按钮,并在提交按钮上触发操作时,它确实按预期运行...
代码
控制器的
public PartialViewResult Filter(string filterName) {
var names = from p in db.People
select p;
if (!String.IsNullOrEmpty(filterName))
{
names = names.Where(p => p.Name.Equals(filterName));
}
return PartialView("_PersonsTable", names);
}
视图的
@model IEnumerable<Sandbox.Models.Person>
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Ajax.BeginForm("Filter", "Person", new AjaxOptions {
HttpMethod = "Get", UpdateTargetId = "SearchResults", InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace }))
{
@Html.DropDownList("filterName", new SelectList(ViewBag.Names), "Select a name", new { onchange = "this.form.submit()" })
}
@Html.Partial("_PersonsTable")
部分视图
@model IEnumerable<Sandbox.Models.Person>
<table id="SearchResults">
<tr>
<th>
Name
</th>
<th>
Age
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.Age)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
@Html.ActionLink("Details", "Details", new { id=item.ID }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ID })
</td>
</tr>
}
</table>
那么为什么我的searchResults表不会呈现为局部视图?
我的_Layout视图中包含这些脚本:
<script src="/Scripts/jquery-1.7.2.js" type="text/javascript"></script>
<script src="/Scripts/modernizr-1.7.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftAjax.debug.js" type="text/javascript"></script>
<script src="/Scripts/MicrosoftMvcAjax.debug.js" type="text/javascript"></script>
答案 0 :(得分:35)
在您的下拉列表中替换:
new { onchange = "this.form.submit()" }
使用:
new { onchange = "$(this.form).submit();" }
还要删除所有MicrosoftAjax*.js
脚本。这些完全是遗留的,不应在ASP.NET MVC 3和更新的应用程序中使用。如果您要从旧版本迁移,则仅出于兼容性原因提供它们。 jQuery.js
和jquery.unobtrusive-ajax.js
就足够了。
答案 1 :(得分:0)
不确定我是否理解正确,但如果提交按钮工作正常,为什么不这样做呢:
@Html.DropDownList("filterName", new SelectList(ViewBag.Names), "Select a name", new { onchange = "clickMe('mybuttonId')" })
并编写小脚本
function clickMe(id) {
$('#' + id).click() // where id is id of button that should submit the form.
}
如果您不想显示按钮,则只需将其隐藏即可。如果它不符合您的需求,我们可以进一步调查。