Кажется, есть несколько проблем с вашим кодом, которые я вижу на первый взгляд:
- Вы отключили макет на главном экране => Я не вижу, где у вас естьссылаются на необходимые сценарии
jQuery.js
и jquery.unobtrusive-ajax.js
- Ваше действие контроллера
Files
украшено атрибутом [ChildActionOnly]
, означающим, что к нему нельзя получить доступ с помощью вызова Ajax
Я попытался немного очистить ваш код и привел пример:
public class HomeController : Controller
{
public ActionResult Index()
{
var files = IEnumerable<File> results = repository.FindAll();
return View(files);
}
[HttpPost]
public ActionResult Index(string filePath)
{
var files = repository.FindBy(f => f.Path.StartsWith(filePath)).Take(5);
return View("_grid", files);
}
}
, и тогда у вас может появиться соответствующее представление Index.cshtml
:
@model IEnumerable<DAL.File>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
@using (Ajax.BeginForm(new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "myGrid" }))
{
@Html.TextBox("filePath", null, new { onkeyup = "$('form').submit()" })
}
<div id="myGrid">
@Html.Partial("_grid", Model)
</div>
и _grid.cshtml
частичный:
@model IEnumerable<DAL.File>
@{
Layout = null;
}
@{
var grid = new WebGrid(Model, canPage: true, rowsPerPage: 10, ajaxUpdateContainerId: "myGrid");
grid.Pager(WebGridPagerModes.NextPrevious);
@grid.GetHtml(
tableStyle: "webGrid",
headerStyle: "header",
alternatingRowStyle: "alt",
columns: grid.Columns(
grid.Column("Path", "File"),
grid.Column("Size", "Size (bytes)", canSort: true),
grid.Column("User", "Owner")
)
)
}
Также обратите внимание, что хамеринг вашего сервера AJAX-запросами каждый раз, когда пользователь вводит какой-либо ключ в текстовое поле, является очень плохой идеей.