【发布时间】:2017-02-18 15:31:24
【问题描述】:
我想在不使用局部视图刷新页面的情况下更新原始表视图列表
我的主视图控制器
public ActionResult Index()
{
IEnumerable<ClassFile> listdata = ...
return View(listdata);
}
查看页面
@model IEnumerable<ProjectName.Model.ClassFile>
@{
ViewBag.Title = "Dashboard";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="col-md-12 col-sm-12 col-xs-12">
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
</tr>
</thead>
<tbody id="sampledata">
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(model => item.ID)</td>
</tr>
}
</tbody>
</table>
</div>
在_Layout 页面中,我有以下弹出窗口来搜索和 ajax 调用来更新上面的视图
<!DOCTYPE html>
<html>
<head>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<div class="content-page">
<div class="content">
<div class="container">
RenderBody()
<footer class="">
</footer>
</div>
</div>
<div id="panel-modal">
<div class="form-group">
<input type="text" id="searchstring">
</div>
<div class="form-group">
<button id="btnSearch" type="button" class="ss">Search</button>
</div>
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
</html>
<script type="text/javascript">
$(document).ready(function () {
$('#btnSearch').click(function () {
$.ajax({
type: "POST",
url: "/Home/SampleSearch",
data: { searchtext: $('#searchstring').val()},
dataType: "html",
Success: function (response)
{
alert("Success");
$('#sampledata').html(response);
},
error: function ()
{
alert("error");
}
});
return false
});
});
</script>
对于上述搜索功能,我在同一控制器中有以下方法
[HttpPost]
public ActionResult SampleSearch(string searchstring)
{
IEnumerable<ClassFile> listsearchData = ...
return PartialView("Index", listsearchData );
}
但是这里初始表加载工作正常,但是当我通过弹出窗口搜索并单击 btnSearch 按钮时,它没有更新索引页面,当我调试时,我可以看到 SampleSearch 方法中的值,也没有发生错误
【问题讨论】:
-
为什么将索引页面作为部分视图响应返回,因为它声明为视图页面?部分视图应该使用
@Html.Partial或@Html.RenderPartial来渲染它们。如果您的操作方法返回要在页面正文中呈现的 html 响应,请改用 @Html.Raw。 -
您的
Index.cshtml视图包含表格,因此请从<tbody>元素中删除id="sampledata",并在您的布局中为占位符添加<div id="sampledata"></div>。或者,创建一个单独的局部视图,仅呈现<tbody>元素 -
$.ajax设置对象的所有属性都以小写字母开头,但您似乎在使用Success: ... -
我更喜欢使用单独的局部视图文件,因为它具有返回局部视图的
SampleSearch操作方法。由于 JS 本质上是区分大小写的,因此在查找success时,Success属性可能不匹配。 -
@StephenMuecke 我应该在哪里添加
<div id="sampledata"></div>_Layout页面
标签: c# ajax asp.net-mvc razor partial-views