2013-03-14 3 views
0

Я использую jquery ajax для вызова (получения) действия, которое отображает частичное представление для создания (ввода) нового продукта. Содержимое этого частичного просмотра вставляется в тег vid на полной странице с базой _layout. Аякса код ниже:Страница входа перенаправляется обратно только на обнаженный частичный вид

$("#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, создавая частичное представление без каких-либо элементов своего родительского представления. Если страница CREATE НЕ является частичным просмотром, страница входа в систему полностью перенаправляется на полную страницу.

Я использую имя входа MVC4 defafult. Я попытался отправить страницу входа в форму ajax и использовать OnSuccess для вызова document.location как на странице входа, так и в создании частичного просмотра, но я обнаружил, что это проблема returnUrl частичного просмотра. Я также попробовал Request.UrlReferrer.AbsoluteUri, но он дает тот же URL-адрес, что «/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-адрес, который отображает частичное представление внутри его родительского представления? если нет, то можно ли перенаправить назад к предыдущему виду из частичного просмотра?


Выглядит, нет URL-адреса для частичного просмотра с его главной страницей. Решение, о котором я могу сейчас думать, - это перевести логин на главную страницу и передать имя частичного просмотра в Model или viewbag или temp сеанса, чтобы снова отобразить всю страницу с правильным частичным просмотром.

ответ

0

Вот как я работаю над этой проблемой. Не чувствуйте себя очень комфортно. Если у кого-то есть лучшее решение, пожалуйста, помогите.

Я добавил два строковых vars в 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) 

В АЯКС OnSuccess обработчика событий, добавьте строку запроса CallPartial в конце ReturnUrl и перенаправить на этот 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); 
      } 
     }); 
    } 
Смежные вопросы