Я пытаюсь добавить функциональность Ajax в мое приложение MVC.Я хочу, чтобы форма отправлялась обратно асинхронно.Вот код формы:
using (Ajax.BeginForm("SetInterviewee", "Date", routeValues, new AjaxOptions { UpdateTargetId = "divInterviewee" }))
, и я хочу, чтобы он автоматически отправлял сообщения при изменении выбранного значения в раскрывающемся списке:
<%= Html.DropDownList("interviewees", Model.interviewees.intervieweeLists.intervieweesList, "-- select employee --", new { @class = "ddltext", style = "width: 200px", onchange = "this.form.submit();" })%>
Однако, когда я пытаюсь это сделать, программа публикуетвернулся нормально, не частичный постбэк, как я ожидал.Вот что я думаю, проблема в следующем: onchange = "this.form.submit ();"в раскрывающемся списке.
Я думаю, что это как-то вызывает нормальную обратную передачу вместо асинхронной обратной передачи.
Вот что MVC генерирует для HTML для тега формы:
<form action="/SetInterviewee/2011-1-26/2011-1/visit" method="post" onclick="Sys.Mvc.AsyncForm.handleClick(this, new Sys.UI.DomEvent(event));" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, updateTargetId: 'divInterviewee' });">
Я думаю, что с помощью this.form.submit () обработчик события onsubmit не вызывается.Дело в том, что я не понимаю почему.Разве «onsubmit» не перехватит какое-либо событие, отправляющее форму?
ОБНОВЛЕНИЕ: Я перешел на jquery, таким образом:
$(function () {
$('#interviewees').change(function () {
var form = $('#intervieweeForm');
$.ajax({
url: form.attr('action'),
type: form.attr('method'),
data: form.serialize(),
success: function (result) {
$('#selectedInterviewee').val(result);
}
});
});
});
Это вызывает много проблем, среди них:
- По-видимому, он все еще не выполняет асинхронный постбэк.В моем методе действия контроллера у меня есть следующий код: «if (Request.IsAjaxRequest ())», который возвращает false.
- Кажется, я больше не могу делать привязку модели.Мой маршрут выглядит так:
http://localhost:1986/Interviews/2011-2-25/2011-2/visit
, но маршрут, который, по-видимому, заканчивается отправкой, является
http://localhost:1986/SetInterviewee/2011-2-25/2011-2?
Count=5&Keys=System.Collections.Generic.Dictionary`2+KeyCollection
[System.String,System.Object]
&Values=System.Collections.Generic.Dictionary`2+ValueCollection
[System.String,System.Object]
, в результате чего привязка модели не работает - "визит"предполагается, что это параметр" mode ", но его там нет, поэтому по умолчанию для" mode "устанавливается значение" phone ", которое расстраивает всю яблочную тележку.
Это вызывает команда serialize?Я не понимаю, почему он добавил бы его в строку запроса, когда метод POST.
Есть и другие вещи - среди них тот факт, что мое действие должно возвращать ViewResult, так как я могу простоверните строку, и это все, что мне нужно, используя ajax ... но я откладываю эту проблему до тех пор, пока не исправлю вещи маршрутизации / привязки!
ОБНОВЛЕНИЕ: "SetInterviewee" действительно правильный путь для публикации в, но параметр routeValues должен копировать значения маршрута из текущего представления - я бы подумал.Вот код для формы:
RouteValueDictionary routeValues = ViewContext.RouteData.Values;
using (Html.BeginForm("SetInterviewee", "Date", routeValues, FormMethod.Post, new { id = "intervieweeForm" }))