2012-03-06 40 views
1

我有一个登录小部件,这是一个局部视图,我想在出现问题时更新模型验证错误,否则应该重新加载页面。asp.net mvc部分视图重定向或显示错误

我有以下

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行时,此部分才有效那里为用户登录成功和页面应重定向。

有没有更好的方法来做到这一点?

我曾尝试返回具有status属性和returnUrl或Html的Json()的匿名对象,但我无法弄清楚如何获取由PartialView(userDetails)生成的html到Json( )电话,而且看起来这可能是反正事情的错误方式。

回答

1

您不能在AJAX调用中重定向。你可以从服务器返回一个指向url的JSON对象重定向到,然后在你的成功回调中执行实际的重定向。

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 }); 

通过你似乎已经在该视图返回URL的方式:Request.Url.PathAndQuery。我没有看到将它传输到服务器并返回的意义。你可以简单地返回一些表示成功的JSON布尔值,并在成功回调中执行重定向到url。

+0

我想知道如果我使用jquery.ajax,如果它会工作,因为它似乎有支持状态代码? – 2012-03-06 12:25:38

+0

@DanielPowell,这正是unobtrusibve-ajax在封面下使用的 - > jquery.ajax。所以它会完全相同。而且,不,当然,它不适用于jquery.ajax或任何AJAX调用,即使是最基本的XmlHttpRequest对象内置浏览器。如果您在服务器中重定向,则客户端会自动遵循重定向,直到它到达最终目的地,当然这些目的地的状态码为200。 – 2012-03-06 12:31:21

相关问题