2013-03-14 26 views
0

我使用jquery ajax調用(獲取)一個動作,呈現一個partialview來創建(輸入)一個新產品。這個partialview的內容被插入到一個完整頁面的vid標籤中,該頁面有一個base _layout。下面的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按鈕。由於[授權],登錄頁面將首先登錄,並且在登錄後,它將一起重定向回到我的CREATE partialview。問題在於登錄頁面重定向回NAKED創建的partialview,而沒有任何父視圖的元素。如果CREATE頁面不是partialview,則登錄頁面將完全重定向到完整頁面。

我使用MVC4默認登錄。我試圖使登錄頁面成爲ajax表單提交併使用OnSuccess在登錄頁面和創建partialview中調用document.location,但是我發現它是partialview的returnUrl問題。我也嘗試了Request.UrlReferrer.AbsoluteUri,但它給出了「/CreateGroup/CreateGroup?returnUrl=http%3A%2F%2Fwww.dev.com%3A22531%2F」或完整的相同URL:http://www.dev.com:22531/CreateGroup/CreateGroup?returnUrl=http://www.dev.com:22531/。如果您將Url放入瀏覽器中,它也會顯示純粹的partialview。

我相信我一定錯過了一些顯而易見的事情,這應該是一種常見的情況,但我無法從Google搜索中找到任何線索。有沒有一個URL在其父視圖內一起顯示partialview?如果不是,那麼可以重定向回偏向視圖的前一個視圖?


看起來沒有用於其主頁的partialview的URL。我現在能想到的解決方案是將登錄重定向到主機頁面,並在Model或viewbag或會話temp中傳入partialview名稱,以使用右部分視圖再次呈現整個頁面。

回答

0

這是我如何解決這個問題。不要覺得很舒服。如果有人有更好的解決方案,請幫助。

我在LoginModel中添加了兩個字符串變量:
public string RetUrl {get;組; } public string UrlReferrer {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:把兩個隱藏字段保留模型預置值:

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

在AJAX的onSuccess事件處理程序,在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主頁面:

  $('.ifCallPartial').each(function() { 
     //debugger; 
     if ('@Request["CallPartial"]' == "True") { 
      $(document).ready(function() { 
       CallCreate(); 
      }); 
     } 
    }); 

    function CallCreate() { 
     //debugger; 
     //e.preventDefault(); 
     var returl = String(window.location); 
     var n = returl.indexOf("?CallPartial"); 
     if (n >= 1) { 
      returl = returl.substring(0, n); 
     } 
     else { 
      n = returl.indexOf("CallPartial"); 
      if (n >= 1) { 
       returl = returl.substring(0, n); 
      } 
     } 
     $.ajax({     
      type: "GET", 
      data: { returnUrl: returl }, 
      url: "/CreateGroup/CreateGroup", 
      dataType: 'html', 
      success: function (data) { 
       $("#group-list").html(data); 
      }, 
      error: function (xhr, status, error) { 
       alert(error); 
      } 
     }); 
    }