ASP 취득 방법UpdateTargetId에 뷰를 삽입하는 대신 새 페이지로 리디렉션하는 NET MVC 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]
}
삭제에 성공하면 Redirect 결과를 반환합니다.
[Authorize]
public ActionResult Delete(Int32 UserId)
{
UserRepository.DeleteUser(UserId);
return Redirect(Url.Action("Index", "Home"));
}
그러나 홈 컨트롤러 인덱스 뷰가 UpdateTargetId로 로드되고 있기 때문에 페이지 내에 페이지가 표시됩니다.내가 생각하고 있는 두 가지는:
- 이 아키텍처가 잘못되어 있기 때문에 (ajax를 사용하지 않고) 이러한 유형의 액션을 다르게 처리해야 합니다.
- Redirect 결과를 반환하는 대신 클라이언트 측에서 리다이렉트를 수행하는 javascript가 포함된 보기를 반환하십시오.
1위에 대한 의견 있으신가요?또는 #2가 좋은 솔루션이라면 "javascript 뷰 리다이렉트"는 어떻게 될까요?
하시면 됩니다.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;
물론 서버 측에서 오류가 발생할 수 있으며, 이 경우 결과 속성이 이 상황을 나타내 리다이렉션을 회피할 수 있기 때문에 로직을 추가할 수 있습니다.
우아하지는 않지만 특정 상황에서는 효과가 있습니다.
컨트롤러
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>
당신이 만들고자 하는 동작은 AJAX를 사용하는 것이 가장 좋은 것은 아닙니다.AJAX는 페이지의 일부만 업데이트하고 다른 페이지로 완전히 리디렉션하지 않는 경우에 사용하는 것이 좋습니다.그것은 AJAX의 전체 목적을 정말로 좌절시킨다.
당신이 설명한 동작에는 AJAX를 사용하지 않는 것이 좋습니다.
또는 jquery 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)
「」를 사용합니다.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;
}
}
Joseph의 최선의 답변에 만족하지 못하고, 그는 올바른 문제를 수정하는 대신 이것이 잘못된 사용 사례라고 말했습니다.예를 들어 오래된 코드베이스를 아약스화된 코드로 변환하고 있으며, 필요한 경우 NEADE가 필요합니다.프로그래밍에 있어서 변명의 여지가 없습니다.왜냐하면 모든 나쁜 개발자와 좋은 개발자를 코드화하는 것은 당신뿐만이 아니라 당신이 함께 일해야 하기 때문입니다.따라서 Ajax에서 리다이렉션을 코드화하지 않으면 동료 개발자가 강제로 리다이렉트 솔루션을 만들 수 있습니다.AMD 패턴의 사이트나 MVC4를 모두 사용하고 싶기 때문에 1년간은 사용하지 않아도 됩니다.
그럼 이제 해결책에 대해 이야기해 보겠습니다.
저는 Ajax 요청과 응답 처리에 많은 어려움을 겪었고, 제가 알아낸 가장 간단한 방법은 클라이언트에 상태 코드를 전송하고 이러한 코드를 이해하기 위한 하나의 표준 자바스크립트 함수를 갖는 것이었습니다.예를 들어 코드 13을 보내면 리다이렉트를 의미할 수 있습니다.
따라서 {statusCode: 13, 메시지: '/home/logged-in'}과 같은 json 응답에는 {status: 'success', 코드: 13, url: '/home/logged-in', 메시지: 'You are logged-in'과 같은 다양한 종류가 제안됩니다.
etc, 표준 메시지 선택 가능
보통 기본 컨트롤러 클래스에서 상속하여 표준 응답을 다음과 같이 설정합니다.
public JsonResult JsonDataResult(object data, string optionalMessage = "")
{
return Json(new { data = data, status = "success", message = optionalMessage }, JsonRequestBehavior.AllowGet);
}
public JsonResult JsonSuccessResult(string message)
{
return Json(new { data = "", status = "success", message = message }, JsonRequestBehavior.AllowGet);
}
public JsonResult JsonErrorResult(string message)
{
return Json(new { data = "", status = "error", message = message }, JsonRequestBehavior.AllowGet);
}
public JsonResult JsonRawResult(object data)
{
return Json(data, JsonRequestBehavior.AllowGet);
}
Ajax의 $.ajax interad 사용에 대해Begin Form 저는 Jquery Ajax를 사용하고 싶습니다만, Ajax가 가득 찬 어플리케이션을 가지고 있다고 판단할 수 있는 것은 아닙니다.Begin Form과 물론 저는 그렇게 하지 않았습니다.하지만 감수해야 해요
따라서 시작 형식에서도 성공 콜백이 있습니다.여기서 Ajax를 사용하여 콜백 사용 시 jquery ajax를 사용할 필요가 없습니다.BeginForm, Calls Action, Returns JSON, OnSuccess JS 함수에서 JSON 개체에 액세스하는 방법
감사해요.
Ajax 로그인 폼이 있기 때문에 이 작업을 수행해야 했습니다.사용자가 정상적으로 로그인하면 새로운 페이지로 리다이렉트하여 이전 요청을 종료합니다.이는 다른 페이지가 (STS SSO 시스템이기 때문에) 의존하는 상대에게 리다이렉트를 처리하기 때문입니다.
단, javascript disabled, 중앙 로그인 홉 등에서도 동작하고 싶다고 생각하고, 이것을 생각해 냈습니다.
public static string EnsureUrlEndsWithSlash(string url)
{
if (string.IsNullOrEmpty(url))
throw new ArgumentNullException("url");
if (!url.EndsWith("/"))
return string.Concat(url, "/");
return url;
}
public static string GetQueryStringFromArray(KeyValuePair<string, string>[] values)
{
Dictionary<string, string> dValues = new Dictionary<string,string>();
foreach(var pair in values)
dValues.Add(pair.Key, pair.Value);
var array = (from key in dValues.Keys select string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(dValues[key]))).ToArray();
return "?" + string.Join("&", array);
}
public static void RedirectTo(this HttpRequestBase request, string url, params KeyValuePair<string, string>[] queryParameters)
{
string redirectUrl = string.Concat(EnsureUrlEndsWithSlash(url), GetQueryStringFromArray(queryParameters));
if (request.IsAjaxRequest())
HttpContext.Current.Response.Write(string.Format("<script type=\"text/javascript\">window.location='{0}';</script>", redirectUrl));
else
HttpContext.Current.Response.Redirect(redirectUrl, true);
}
$.ajaxSetup으로 응답을 연결하기 위한 일종의 ajax 응답 필터를 수행할 수 있습니다.응답에 MVC 리다이렉션이 포함되어 있는 경우 JS 측에서 이 식을 평가할 수 있습니다.아래 JS의 코드 예:
$.ajaxSetup({
dataFilter: function (data, type) {
if (data && typeof data == "string") {
if (data.indexOf('window.location') > -1) {
eval(data);
}
}
return data;
}
});
데이터가 위의 "filter.location = '/Acount/Login'인 경우 이를 포착하고 평가하여 리디렉션을 수행합니다.
JavaScript 클래스에서 리디렉션하는 경우
동일 뷰 - 다른 컨트롤러
<strike>window.location.href = `'Home'`;</strike>
동일하지 않다
<strike>window.location.href = `'Index/Home'`;</strike>
도우미 클래스 추가:
public static class Redirector {
public static void RedirectTo(this Controller ct, string action) {
UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);
ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action));
}
public static void RedirectTo(this Controller ct, string action, string controller) {
UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);
ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller));
}
public static void RedirectTo(this Controller ct, string action, string controller, object routeValues) {
UrlHelper urlHelper = new UrlHelper(ct.ControllerContext.RequestContext);
ct.Response.Headers.Add("AjaxRedirectURL", urlHelper.Action(action, controller, routeValues));
}
}
그런 다음 조치를 취하십시오.
this.RedirectTo("인덱스", "시멘트");
javascript 코드를 글로벌 javascript 포함 파일 또는 레이아웃 파일에 추가하여 모든 ajax 요청을 가로채십시오.
<script type="text/javascript">
$(function() {
$(document).ajaxComplete(function (event, xhr, settings) {
var urlHeader = xhr.getResponseHeader('AjaxRedirectURL');
if (urlHeader != null && urlHeader !== undefined) {
window.location = xhr.getResponseHeader('AjaxRedirectURL');
}
});
});
</script>
Ben Foster의 말대로 Javascripts를 반환하면 원하는 페이지로 리디렉션됩니다.
현재 페이지의 페이지를 로드하려면:
return JavaScript("window.location = 'http://www.google.co.uk'");'
새 탭에서 페이지를 로드하려면:
return JavaScript("window.open('http://www.google.co.uk')");
이러한 메타 리프레시 태그 중 하나를 삽입하면 Ajax 콜에서 비js 기반 리다이렉션을 얻을 수 있습니다.여기에서는 효과가 있는 것 같습니다. return Content("<meta http-equiv=\"refresh\" content=\"0;URL='" + @Url.Action("Index", "Home") + "'\" />");
주의: Firefox에서는 메타 새로고침이 자동으로 비활성화되므로 이 기능은 그다지 유용하지 않습니다.
승인된 답변은 javascript가 Ajax 타깃 요소에 관계없이 짧게 표시되는 것을 제외하고는 잘 작동합니다.이 문제를 해결하려면 다음 코드를 사용하여 _Redirect라는 이름의 부분 보기를 만듭니다.
@model string
<script>
window.location = '@Model';
</script>
그런 다음 컨트롤러로 교체합니다.
return Redirect(Url.Action("Index", "Home"));
와 함께
return PartialView("_Redirect",Url.Action("Index", "Home"));
효과는 승인된 답변과 동일하지만 간략한 아티팩트는 표시되지 않습니다.어디서든 사용할 수 있도록 _Redirect.cshtml을 공유 폴더에 배치합니다.
언급URL : https://stackoverflow.com/questions/1538523/how-to-get-an-asp-net-mvc-ajax-response-to-redirect-to-new-page-instead-of-inser
'codememo' 카테고리의 다른 글
| 반응 재료 UI 레이블이 텍스트와 겹침 (0) | 2023.03.04 |
|---|---|
| td에서 정렬 버튼의 중심을 맞추는 중 (0) | 2023.03.04 |
| 사용자 지정 주문 메타를 woocommerce 전자 메일로 호출합니다. (0) | 2023.03.04 |
| 오류 콜백에 사용할 AJAX 응답 본문을 가져오는 중 (0) | 2023.03.04 |
| MongoDB - $size 인수는 어레이여야 하지만 유형: EOO / missing (0) | 2023.02.27 |