2013-03-14 1 views
0

jquery ajax를 사용하여 새 제품을 생성 (입력)하는 부분 뷰를 렌더링하는 동작을 호출합니다. 이 partialview의 내용은 기본 _layout이있는 전체 페이지의 vid 태그에 삽입됩니다. 아래의 Ajax 코드 :로그인 페이지가 누드 부분보기로 다시 리디렉션됩니다.

$("#Create").on('click', function (e) { 
    //debugger; 
    e.preventDefault(); 
    $.ajax({ 
     type: "GET",    
     data: { returnUrl: String(window.location) }, <-- passing in the Url 
     url: "/CreateGroup/CreateGroup", 
     dataType: 'html', 
     success: function (data) { 
      $("#group-list").html(data); 
     }, 
    }); 
}) 
..... 
<div id="group-list"> 
    @Html.Partial("PagedGroupList") 
</div> 

액션 :

내가 만들기 버튼을 클릭하기 전에 먼저 로그인하면 예상대로
// GET: /Create/ 
[Authorize] 
public PartialViewResult CreateGroup(string returnUrl) 
{ 
    ViewBag.ReturnUrl = returnUrl; 
    CreateGroupModel cgm = new CreateGroupModel(); 
    cgm.ReturnUrl = returnUrl; 
    cgm.group = new Static_Group(); 
    return PartialView("CreateGroup", cgm); 
} 

지금, eveerything이 괜찮습니다. 문제는 로그인없이 CREATE 버튼을 처음 클릭 할 때입니다. [Authorize]로 인해 로그인 페이지가 먼저 나타나고 로그인 후에 전체 페이지 내의 CREATE partialview로 다시 리다이렉트 될 것으로 예상됩니다. 문제는 로그인 페이지가 상위 뷰의 요소없이 NAKED create partialview로 다시 리디렉션된다는 것입니다. CREATE 페이지가 partialview가 아닌 ​​경우 로그인 페이지는 전체 페이지로 완벽하게 재 지정됩니다.

MVC4 defafult login을 사용합니다. 로그인 페이지를 ajax 양식으로 만들고 OnSuccess를 사용하여 로그인 페이지와 create partialview에서 document.location을 호출하려고 시도했지만 partialview의 returnUrl 문제인 것으로 나타났습니다. 또한 Request.UrlReferrer.AbsoluteUri를 시도했지만 "/CreateGroup/CreateGroup?returnUrl=http%3A%2F%2Fwww.dev.com%3A22531%2F"또는 전체로 http://www.dev.com:22531/CreateGroup/CreateGroup?returnUrl=http://www.dev.com:22531/ 인 동일한 URL을 제공합니다. URL을 브라우저에 넣으면 순수한 부분보기도 표시됩니다.

나는 이것이 일반적인 시나리오 여야 만하는 확실한 무언가를 놓쳤음에 틀림 없다고 생각하지만 나는 인터넷 검색으로부터 어떤 스레드도 찾을 수 없었다. 부모보기 내부에 partialview를 함께 표시하는 URL이 있습니까? 그렇다면 부분보기에서 이전보기로 다시 리디렉션 할 수 있습니까?


호스트 페이지에 부분보기 URL이없는 것 같습니다. 내가 지금 생각할 수있는 해결책은 호스트 페이지로의 로그인 리디렉션을 얻고 Model 또는 viewbag 또는 session temp의 partialview 이름을 전달하여 전체 페이지를 오른쪽 partialview로 다시 렌더링합니다.

답변

0

다음은이 문제를 해결하는 방법입니다. 아주 편안하게 느끼지 마십시오. 누구든지 더 나은 해결책이 있다면 도움을주십시오.

LoginModel에 두 개의 문자열 변수를 추가했습니다.
public string RetUrl {get; 세트; } public string UrlReferrer {get; 세트; } GET 로그인 행동에서

: 포스트 로그인 액션에서

 public PartialViewResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = Request.UrlReferrer.AbsolutePath; 
     LoginModel lgm = new LoginModel(); 
     lgm.UrlReferrer = Request.UrlReferrer.AbsoluteUri; 
     lgm.RetUrl = returnUrl; 
     return PartialView(lgm); 
    } 

: 로그인에

 public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe)) 
      { 
       model.IsLoggedIn = true; 
       if (string.IsNullOrEmpty(model.RetUrl)) 
       { 
        model.RetUrl = Url.Action("Index", "Home"); 
       } 
      } 
      else 
      { 
       // If we got this far, something failed, redisplay form 
       ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      } 
     } 
     return PartialView("Login", model); 
    } 

.cshtml는 : AJAX onsuccess는 이벤트 핸들러

   @Html.HiddenFor(m => m.RetUrl) 
      @Html.HiddenFor(m => m.UrlReferrer) 

returnUrl의 단부에 CallPartial의 쿼리 스트링을 추가하고이 returnUrl 리디렉션 :

 <script type="text/javascript"> 
function logInComplete() { 
    //debugger; 
    if ('@Model.IsLoggedIn' == 'True' && '@Model.UrlReferrer' != '') { 
     //debugger; 
     var returnUrl = '@Model.UrlReferrer'; 
     if ('@Model.RetUrl' != '@Model.UrlReferrer') { 
      if (returnUrl.indexOf('?') == -1) { 
       returnUrl = returnUrl + "?CallPartial=True"; 
      } 
      else { 
       returnUrl = returnUrl + "&CallPartial=True"; 
      } 
     } 
     document.location = returnUrl; 
    } 
} 

모델 소정 값을 유지하는 두 개의 숨겨진 필드 넣어

이제 CREATE partialview 호스트 페이지로 돌아갑니다.