Как отправить форму ASP.NET MVC Ajax с помощью JavaScript, а не кнопки отправки
У меня есть простая форма, созданная с помощью Ajax.BeginForm
:
<% using (Ajax.BeginForm("Update", "Description", new { id = Model.Id },
new AjaxOptions
{
UpdateTargetId = "DescriptionDiv",
HttpMethod = "post"
},new {id ='AjaxForm' })) {%>
Description:
<%= Html.TextBox("Description", Model.Description) %><br />
<input type="submit" value="save" />
<% }%>
Контроллер подключен и возвращает частичное представление, которое обновляет DescriptionDiv
. И все это работает аккуратно.
Теперь я хотел бы иметь возможность отправить эту форму без кнопки отправки (через клик по ссылке или на изображении или что-то еще). К сожалению, этот небольшой фрагмент jQuery не выполняет эту работу:
$('form#AjaxForm').submit();
Он представляет форму, но делает (я полагаю, не удивительно) регулярный пост-назад, а не Ajax.
Для простоты вышеуказанный jQuery подключается следующим образом:
<a href="#" onclick="$('form#AjaxForm').submit(); return false;">submit</a>
В форме onsubmit используется Sys.Mvc.AsyncForm.handleSubmit(), но представляется, что комментарий jQuery обходит это.
PS. Я ищу решение в этом конкретном подходе. Я знаю, как добиться того же, используя обычную форму и опубликовать ее с помощью AJAX + jQuery. Меня интересует именно это решение.
Ответы
Ответ 1
Я собираюсь предположить, что ваше отсутствие цитат вокруг селектора - это просто ошибка транскрипции, но вы все равно должны ее проверить. Кроме того, я не вижу, где вы на самом деле даете форму id. Обычно вы делаете это с помощью параметра htmlAttributes. Я не вижу, чтобы вы использовали подпись. Опять же, если форма вообще отправляется, это может быть ошибкой транскрипции.
Если селектор и идентификатор не являются проблемой, я подозреваю, что это может быть связано с тем, что обработчик кликов добавляется через разметку при использовании расширения Ajax BeginForm. Вы можете попробовать использовать $('form'). Trigger ('submit') или в худшем случае, обработчик клика на якоре создайте скрытую кнопку отправки в форме и щелкните по ней. Или даже создайте собственное представление ajax, используя чистый jQuery (что, вероятно, я и сделаю).
Наконец, вы должны понимать, что, заменив кнопку "Отправить", вы полностью прервете это для людей, у которых нет javascript. Путь вокруг этого - также иметь кнопку, скрытую с помощью тега noscript, и обрабатывать сообщения AJAX и не-AJAX на сервере.
Кстати, он рассматривает стандартную практику, которую Microsoft не выдерживает, для добавления обработчиков через javascript не через разметку. Это позволяет организовать javascript в одном месте, чтобы вы могли более легко увидеть, что происходит в форме. Вот пример того, как я буду использовать механизм запуска.
$(function() {
$('form#ajaxForm').find('a.submit-link').click( function() {
$('form#ajaxForm').trigger('submit');
}).show();
}
<% using (Ajax.BeginForm("Update", "Description", new { id = Model.Id },
new AjaxOptions
{
UpdateTargetId = "DescriptionDiv",
HttpMethod = "post"
}, new { id = "ajaxForm" } )) {%>
Description:
<%= Html.TextBox("Description", Model.Description) %><br />
<a href="#" class="submit-link" style="display: none;">Save</a>
<noscript>
<input type="submit" value="Save" />
</noscript>
<% } %>
Ответ 2
Простой пример, когда изменение в раскрывающемся списке вызывает форму ajax-submit для перезагрузки datagrid:
<div id="pnlSearch">
<% using (Ajax.BeginForm("UserSearch", "Home", new AjaxOptions { UpdateTargetId = "pnlSearchResults" }, new { id="UserSearchForm" }))
{ %>
UserType: <%: Html.DropDownList("FilterUserType", Model.UserTypes, "--", new { onchange = "$('#UserSearchForm').trigger('submit');" })%>
<% } %>
</div>
Триггер ('onsubmit') - это ключевая вещь: он вызывает функцию onsubmit, которую MVC перенесла на форму.
NB. Контроллер UserSearchResults возвращает PartialView, который отображает таблицу с помощью поставляемой модели
<div id="pnlSearchResults">
<% Html.RenderPartial("UserSearchResults", Model); %>
</div>
Ответ 3
К сожалению, запуск onsubmit или отправки событий не будет работать во всех браузерах.
- Работает в IE и Chrome: # ('form # ajaxForm') trigger ('onsubmit');
- Работает в Firefox и Safari: # ('form # ajaxForm') trigger ('submit');
Кроме того, если вы запускаете ('submit') в Chrome или IE, это приводит к публикации всей страницы, а не к поведению AJAX.
Что работает для всех браузеров, удаление поведения события onsubmit и просто вызов submit() в самой форме.
<script type="text/javascript">
$(function() {
$('form#ajaxForm').submit(function(event) {
eval($(this).attr('onsubmit')); return false;
});
$('form#ajaxForm').find('a.submit-link').click( function() {
$'form#ajaxForm').submit();
});
}
</script>
<% using (Ajax.BeginForm("Update", "Description", new { id = Model.Id },
new AjaxOptions
{
UpdateTargetId = "DescriptionDiv",
HttpMethod = "post"
}, new { id = "ajaxForm" } )) {%>
Description:
<%= Html.TextBox("Description", Model.Description) %><br />
<a href="#" class="submit-link">Save</a>
<% } %>
Кроме того, ссылка не должна содержаться в форме, чтобы это работало.
Ответ 4
Я пробовал несколько раз, чтобы получить представление формы ajax прекрасно, но всегда встречал либо полный сбой, либо слишком много компромиссов. Здесь приведен пример страницы, в которой плагин jQuery Form внутри страницы MVC обновляет список проектов (с использованием частично визуализированного элемента управления), когда пользователь вводит в поле ввода:
<div class="searchBar">
<form action="<%= Url.Action ("SearchByName") %>" method="get" class="searchSubmitForm">
<label for="projectName">Search:</label>
<%= Html.TextBox ("projectName") %>
<input class="submit" type="submit" value="Search" />
</form>
</div>
<div id="projectList">
<% Html.RenderPartial ("ProjectList", Model); %>
</div>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery("#projectName").keyup(function() {
jQuery(".searchSubmitForm").submit();
});
jQuery(".searchSubmitForm").submit(function() {
var options = {
target : '#projectList'
}
jQuery(this).ajaxSubmit(options);
return false;
});
// We remove the submit button here - good Javascript depreciation technique
jQuery(".submit").remove();
});
</script>
И на стороне контроллера:
public ActionResult SearchByName (string projectName)
{
var service = Factory.GetService<IProjectService> ();
var result = service.GetProjects (projectName);
if (Request.IsAjaxRequest ())
return PartialView ("ProjectList", result);
else
{
TempData["Result"] = result;
TempData["SearchCriteria"] = projectName;
return RedirectToAction ("Index");
}
}
public ActionResult Index ()
{
IQueryable<Project> projects;
if (TempData["Result"] != null)
projects = (IQueryable<Project>)TempData["Result"];
else
{
var service = Factory.GetService<IProjectService> ();
projects = service.GetProjects ();
}
ViewData["projectName"] = TempData["SearchCriteria"];
return View (projects);
}
Ответ 5
Попробуйте выполнить следующее:
<input type="submit" value="Search" class="search-btn" />
<a href="javascript:;" onclick="$('.search-btn').click();">Go</a>
Ответ 6
Ajax.BeginForm выглядит неудачно.
Используя обычный Html.Begin for, это делает трюк только красиво:
$('#detailsform').submit(function(e) {
e.preventDefault();
$.post($(this).attr("action"), $(this).serialize(), function(r) {
$("#edit").html(r);
});
});
Ответ 7
Вместо использования JavaScript, возможно, попробуйте что-то вроде
<a href="#">
<input type="submit" value="save" style="background: transparent none; border: 0px none; text-decoration: inherit; color: inherit; cursor: inherit" />
</a>
Ответ 8
Просто поместите обычную кнопку indide Ajax.BeginForm и нажмите кнопку "Найти родительскую форму" и "нормально отправить". Форма Ajax в бритве:
@using (Ajax.BeginForm("AjaxPost", "Home", ajaxOptions))
{
<div class="form-group">
<div class="col-md-12">
<button class="btn btn-primary" role="button" type="button" onclick="submitParentForm($(this))">Submit parent from Jquery</button>
</div>
</div>
}
и Javascript:
function submitParentForm(sender) {
var $formToSubmit = $(sender).closest('form');
$formToSubmit.submit();
}