2012-03-06 4 views
1

У меня есть виджет входа, который является частичным представлением, которое я хочу обновить с ошибками проверки модели при возникновении проблемы, иначе страница должна быть перезагружена.asp.net mvc частичный просмотр redirect или показать ошибку

У меня есть следующие

LogOn.cshtml

@{ 
    var ajaxOpts = new AjaxOptions {OnSuccess = "success"}; 
} 

<div id="login"> 
    @Html.ValidationSummary(excludePropertyErrors: true) 

    <h2>Start by Logging in</h2> 

    @using (Ajax.BeginForm("LogOn", "Account", ajaxOpts)) 
    { 
     @Html.Hidden("returnUrl", Request.Url.PathAndQuery) 

     <table width="100%" border="0" cellspacing="0" cellpadding="5"> 
      <tr> 
       <td> 
        <span class="bluey">Username:</span><br /> 
        @Html.TextBoxFor(m => m.UserName, new {tabindex = "1", Class = "field"}) 
        @Html.ValidationMessageFor(m => m.UserName, "*") 
       </td> 
       <td> 
        <span class="bluey">Password:</span><br /> 
        @Html.TextBoxFor(m => m.Password, new {tabindex = "2", Class = "field"}) 
        @Html.ValidationMessageFor(m => m.Password, "*") 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <input name="login" type="submit" value="Submit" class="input_btn" tabindex="3" /> 
       </td> 
       <td>@Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe) <span class="bluey">&nbsp; | &nbsp;</span> @Html.ActionLink("Forgot Password?", "Password", "User")</td> 
      </tr> 
     </table> 
    } 
</div> 

<script> 
    function success(context) { 
     //var returnUrl = context.get_data().returnUrl; 
     //if (returnUrl) { 
     // window.location.href = returnUrl; 
     //} else { 
      $("#login").replaceWith(context); 
     //} 

    } 

</script> 

и действие, которое вызывается является

[HttpPost] 
    public ActionResult LogOn(LogOnModel userDetails, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      if (Membership.ValidateUser(userDetails.UserName, userDetails.Password)) 
      { 
       FormsAuthentication.SetAuthCookie(userDetails.UserName, userDetails.RememberMe); 

       return Redirect(returnUrl); 
      } 
      ModelState.AddModelError("", "The username or password provided was incorrect"); 
     } 

     return PartialView(userDetails); 
    } 

У меня он работает так, что, когда данные неверны парциальное просмотр перерисовывается с ошибками, однако эта часть работает только в том случае, если я прокомментирую другие строки javascript в успехе (контексте), которые там, когда пользователь входит в систему успешно, и страница должна быть перенаправлена.

Есть ли лучший способ сделать это?

Я попытался вернуть анонимные объекты с помощью Json(), у которого было свойство status и returnUrl или Html, однако я не мог понять, как получить html, который был бы создан PartialView (userDetails) в Json (), и кажется, что это может быть неправильным способом идти о вещах в любом случае.

ответ

1

Вы не можете перенаправить вызов AJAX. Вы можете вернуть объект JSON с сервера, указав на URL-адрес, чтобы перенаправить его, а затем выполнить фактическое перенаправление в своем обратном вызове.

function success(result) { 
    if (result.returnUrl) { 
     // the controller action returned JSON 
     window.location.href = returnUrl; 
    } else { 
     // the controller action returned a partial 
     $('#login').html(result); 
    } 
} 

Теперь в своем действии контроллера в случае успеха просто вернуть возвратного URL вместо перенаправления:

return Json(new { returnUrl = returnUrl }); 

Кстати, вы уже, кажется, имеют обратный адрес в представлении: Request.Url.PathAndQuery. Я не вижу смысла, чтобы он перешел на сервер и обратно. Вы можете просто вернуть некоторый JSON boolean, указывающий на успех, и выполнить перенаправление в обратном вызове успеха к URL-адресу.

+0

Мне интересно, если я использовал jquery.ajax, если бы это работало, поскольку оно, похоже, поддерживает коды статуса? –

+0

@ DanielPowell, это именно то, что unobtrusibve-ajax использует под обложками -> jquery.ajax. Так что это было бы совершенно равнозначно. И, конечно же, нет, конечно, что он не будет работать с jquery.ajax или любым вызовом AJAX, даже самым базовым встроенным браузером XmlHttpRequest. Если вы перенаправляете на свой сервер, клиент автоматически следует перенаправлению до тех пор, пока не достигнет конечного пункта назначения, который, конечно, будет обслуживаться с кодом состояния 200. –

Смежные вопросы