양식의 .submit
중에 마술을하는 jQuery 플러그인을 사용하고 있습니다 (숨겨진 문자열을 작성하여 <input type="hidden">
항목에 쓰십시오). IE에서 POST를 통해 양식을 제출하면 잘 작동하지만 Ajax를 사용하면 .submit
콜백이 호출되지 않습니다. 여기 흐름의 예입니다IE에서 Ajax를 사용할 때 jQuery가 양식을 호출하지 않습니다.
<script type="text/javascript">
(function (jQuery) {
jQuery.fn.createHidden = function() {
// 1. What I want to have called
$(this).submit(function() {
var hiddenText = $(document.createElement('input'));
hiddenText.attr('name', 'hidden');
hiddenText.attr('type', 'hidden');
hiddenText.val('1');
$(this).append(hiddenText);
alert("1");
});
// 2. What I came up with as a workaround
$(this).parents('div.FormWrapper').submit(function() {
var form = this.children('form');
if (form && form.tagName == "FORM") {
var hiddenText = $(document.createElement('input'));
hiddenText.attr('name', 'hidden');
hiddenText.attr('type', 'hidden');
hiddenText.val('2');
$(form).append(hiddenText);
alert("2");
}
});
};
})(jQuery);
</script>
<script type="text/javascript">
$(document).ready(function() {
$(".form").createHidden();
});
</script>
<div class="FormWrapper">
@*using (Html.BeginForm("About", "Home", FormMethod.Post, new { @class = "form", @id = "form" }))*@
@using (Ajax.BeginForm("About", "Home", new AjaxOptions { UpdateTargetId = "myReply", HttpMethod = "post" }, new { @class = "form", @id = "form" }))
{
<div class="ExposedData">
@Html.TextBox("data", "", new { @class = "data" })
<input type="submit" value="Button" />
<span id="myReply"></span>
</div>
}
</div>
// MVC HomeController.cs
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public string About(string hidden)
{
return hidden;
}
}
IE에서 HTTP POST를 사용하여, 나는 Ajax를 사용하는 경우 경고 1 & 2,하지만 난 단지 만 보여줍니다 경고 2. 파이어 폭스를 볼 참조 1. 크롬, 사파리 오페라 쇼 1 & 2.
모든 브라우저에서 작동하도록 더 나은 수정 방법이 있습니까? MVC3에서 사용중인 jquery.unobtrusive-ajax.js
과 관련이 있습니까?
나는 $('form').ajaxStart()
, AjaxOptions{OnBegin=...}
, <form onsubmit=...>
을 시도했지만 대부분은 컨트롤러가 방문 후 을 호출되는, 따라서 hiddenText이 양식에 포함되지 않기 때문에 그들은 트릭을하지 않았다.
양식 플러그인이 작동하여 문제가 해결되었습니다. 나는 "$ (this) .ajaxSubmit ({target : '#myReply'});" 위의 코드에서 alert ("1") 직전에 Ajax.BeginForm 대신 Html.BeginForm 함수로 전환했습니다. -- 감사!! – clau137
무슨 뜻인지 알 겠어. 나는 내 것이 아니기 때문에 플러그인을 만질 필요가 없기를 바랬다. 위의 코드는 플러그인이 수행하는 작업을 보여줍니다. 한 줄 또는 두 줄의 코드를 추가하는 것이 좋다고 생각했지만 결국에는 당신이 옳았다 고 결정하고 .ajax를 직접 호출하는 것에 대한 조언을 따르고 숨겨진 텍스트를 모두 제거했습니다. – clau137