Подтвердить что ты не робот

Ajax.BeginForm заменяет всю страницу заменой выпадающего списка

Цель

У меня есть простые имена списков таблиц (в частичном представлении), а над ним - раскрывающийся список, содержащий эти имена. Цель состоит в том, чтобы отфильтровать таблицу на основе имени, которое было выбрано в раскрывающемся списке. Фильтрация должна произойти, как только выбранное значение в раскрывающемся списке изменится, и должно снова отобразить только частичное представление.

Проблема

Когда я выбираю значение в раскрывающемся списке, частичный вид не отображается в другом представлении, а отображается как целая страница. Тем не менее, когда я включаю кнопку отправки в свой блок 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>

Итак, почему моя таблица поискаРезультаты не отображаются как частичное представление?

У меня есть эти скрипты, включенные в мое представление _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>
4b9b3361

Ответ 1

В выпадающем меню:

new { onchange = "this.form.submit()" }

с:

new { onchange = "$(this.form).submit();" }

Также избавиться от всех сценариев MicrosoftAjax*.js. Они полностью устарели и не должны использоваться в ASP.NET MVC 3 и более новых приложениях. Они предоставляются только по соображениям совместимости, если вы переносите старые версии. jQuery.js и jquery.unobtrusive-ajax.js достаточно.

Ответ 2

Не уверен, правильно ли я это понимаю, но если кнопка отправки работает нормально, почему бы просто не сделать это:

@Html.DropDownList("filterName", new SelectList(ViewBag.Names), "Select a name", new   { onchange = "clickMe('mybuttonId')" })

и напишите небольшой script

function clickMe(id) {
  $('#' + id).click() // where id is id of button that should submit the form.
}

Если вы не хотите, чтобы кнопка отображалась, просто спрячьте ее. Это взлом, и если он не соответствует вашим потребностям, мы можем продолжить исследование.