Ajax.BeginForm을 사용하여 특정 컨트롤러 작업에 대한 ajax 포스트 백을 수행하는 양식을 만들고 작업이 성공하면 사용자가 다른 페이지로 리디렉션되어야합니다 (작업이 실패하면 상태 메시지가 AjaxOptions UpdateTargetId).
using (Ajax.BeginForm("Delete", null,
new { userId = Model.UserId },
new AjaxOptions { UpdateTargetId = "UserForm", LoadingElementId = "DeletingDiv" },
new { name = "DeleteForm", id = "DeleteForm" }))
{
[HTML DELETE BUTTON]
}
삭제에 성공하면 리디렉션 결과를 반환합니다.
[Authorize]
public ActionResult Delete(Int32 UserId)
{
UserRepository.DeleteUser(UserId);
return Redirect(Url.Action("Index", "Home"));
}
그러나 Home Controller Index 뷰는 UpdateTargetId에로드되므로 페이지 내 페이지로 끝납니다. 내가 생각하는 두 가지 :
- 내가 이것을 잘못 설계하고 있으며 이러한 유형의 작업을 다르게 처리해야합니다 (ajax를 사용하지 않음).
- 리디렉션 결과를 반환하는 대신 클라이언트 측에서 리디렉션을 수행하는 자바 스크립트가있는 뷰를 반환합니다.
누구든지 # 1에 대한 의견이 있습니까? 또는 # 2가 좋은 해결책이라면 “자바 스크립트보기 리디렉션”은 어떤 모습일까요?
답변
JavascriptResult
이것을 달성하기 위해 사용할 수 있습니다 .
리디렉션하려면 :
return JavaScript("window.location = 'http://www.google.co.uk'");
현재 페이지를 다시로드하려면 :
return JavaScript("location.reload(true)");
가장 간단한 옵션 인 것 같습니다.
답변
URL과 함께 JSON을 반환하고 클라이언트 측에서 JavaScript를 사용하여 window.location을 변경할 수 있습니다. 저는 서버에서 JavaScript 함수를 호출하는 것보다이 방법을 선호하는데, 이것이 우려의 분리를 깨고 있다고 생각합니다.
서버 측:
return Json(new {result = "Redirect", url = Url.Action("ActionName", "ControllerName")});
고객 입장에서:
if (response.result == 'Redirect')
window.location = response.url;
물론 서버 측에 오류가있을 수 있고이 경우 결과 속성이이 상황을 표시하고 리디렉션을 피할 수 있기 때문에 더 많은 논리를 추가 할 수 있습니다.
답변
생성하려는 동작은 AJAX를 사용하여 실제로 수행하는 것이 가장 좋습니다. AJAX는 페이지의 일부만 업데이트하고 다른 페이지로 완전히 리디렉션하지 않으려는 경우 가장 적합합니다. 그것은 AJAX의 전체 목적을 정말로 무너 뜨립니다.
설명하는 동작에 AJAX를 사용하지 않는 것이 좋습니다.
또는 요청을 제출 한 다음 요청이 완료 될 때 콜백을 지정하는 jquery Ajax를 사용해 볼 수 있습니다. 콜백에서 실패 또는 성공 여부를 확인하고 성공시 다른 페이지로 리디렉션 할 수 있습니다. 나는 jquery Ajax가 훨씬 더 사용하기 쉽다는 것을 알았습니다. 특히 어쨌든 이미 라이브러리를 사용하고 있기 때문입니다.
여기 에서 jquery ajax에 대한 문서를 찾을 수 있지만 구문은 다음과 같습니다.
jQuery.ajax( options )
jQuery.get( url, data, callback, type)
jQuery.getJSON( url, data, callback )
jQuery.getScript( url, callback )
jQuery.post( url, data, callback, type)
답변
우아하지는 않지만 특정 상황에서 나를 위해 작동합니다.
제어 장치
if (RedirectToPage)
return PartialView("JavascriptRedirect", new JavascriptRedirectModel("http://www.google.com"));
else
... return regular ajax partialview
모델
public JavascriptRedirectModel(string location)
{
Location = location;
}
public string Location { get; set; }
/Views/Shared/JavascriptRedirect.cshtml
@model Models.Shared.JavascriptRedirectModel
<script type="text/javascript">
window.location = '@Model.Location';
</script>
답변
사용 JavaScript
은 확실히 일을 할 것입니다.
Content
이것이 당신의 스타일이라면 사용할 수도 있습니다 .
예:
MVC 컨트롤러
[HttpPost]
public ActionResult AjaxMethod()
{
return Content(@"http://www.google.co.uk");
}
자바 스크립트
$.ajax({
type: 'POST',
url: '/AjaxMethod',
success: function (redirect) {
window.location = redirect;
}
});
답변
다음과 같이 Ajax Success로 간단히 작성할 수 있습니다.
$.ajax({
type: "POST",
url: '@Url.Action("GetUserList", "User")',
data: { id: $("#UID").val() },
success: function (data) {
window.location.href = '@Url.Action("Dashboard", "User")';
},
error: function () {
$("#loader").fadeOut("slow");
}
});
답변
이건 어때 :
public ActionResult GetGrid()
{
string url = "login.html";
return new HttpStatusCodeResult(System.Net.HttpStatusCode.Redirect,url)
}
그리고
$(document).ajaxError(function (event, jqxhr, settings, thrownError) {
if (jqxhr.status == 302) {
location.href = jqxhr.statusText;
}
});
또는
error: function (a, b, c) {
if (a.status == 302) {
location.href = a.statusText;
}
}