Asp.net mvc 2 使用ASP.NETMVC2进行Ajax登录

Asp.net mvc 2 使用ASP.NETMVC2进行Ajax登录,asp.net-mvc-2,forms-authentication,Asp.net Mvc 2,Forms Authentication,这个问题只与我无法让它工作有关。MVC 2更改了其脚本文件,现在获得的脚本文件如下所示: 现在我只是在黑暗中拍摄,但试错已经把我的范围缩小到包括 MicrosoftAjax.js MicrosoftAjaxCore.js MicrosoftJaxComponentModel.js MicrosoftAjaxSerialization.js MicrosoftAjaxNetwork.js MicrosoftAjaxWebServices.js MicrosoftJaxApplicationSer

这个问题只与我无法让它工作有关。MVC 2更改了其脚本文件,现在获得的脚本文件如下所示:

现在我只是在黑暗中拍摄,但试错已经把我的范围缩小到包括

MicrosoftAjax.js
MicrosoftAjaxCore.js
MicrosoftJaxComponentModel.js
MicrosoftAjaxSerialization.js
MicrosoftAjaxNetwork.js
MicrosoftAjaxWebServices.js
MicrosoftJaxApplicationServices.debug.js

问题是我现在得到了javascript异常:

Microsoft JScript运行时错误:Sys.invalidoOperationException:尚未设置web服务的路径

通过谷歌搜索,我发现这个路径应该是“~/ScriptServices\u AuthenticationService.asmx”,但执行类似以下操作:

Sys.Services._AuthenticationService.DefaultWebServicePath = "~/ScriptServices_AuthenticationService.asmx";
不起作用(我假设它是私人会员)。那么,问题是,有人知道如何让ajax/async FormsAuth工作吗?对于各种MS ajax服务所依赖的js文件,是否有明确的指南?最后,如果以上都没有,是否有一种方法可以在服务器端执行FormsAuth,这样它就不会重定向(这样我就可以用ajax表单调用控制器操作)。。。我尝试使用FormsAuthentication.SetAuthCookie(),但这似乎对我不起作用

编辑: 我发现FormsAuthentication.SetAuthCookie()实际上正在工作,但它需要关闭响应流(当然,当发送缓冲区并设置Cookie时)。这对我不起作用,因为对我来说太晚了

编辑: 可能需要对我正在尝试的内容进行完整的描述。我使用的ajax表单用于创建新帐户。在服务器端,我创建帐户并登录。在前端,我等待ajax完成事件,然后将我的注册向导表单前进到下一页,该页将遍历其他注册步骤。在伪代码中,控制器操作如下所示:

public JsonResult CreateAsync(LoginForm form)
{
    CreateAccount(form);

    FormsAuthentication.RedirectFromLoginPage(form.Email, false);

    return Json(
        new
        {
            Email = form.Email,
            Name = form.Name,
            Message = "Success"
        });
}

登录的方法结束了响应流,然后客户端ajax变得混乱。我尝试了FormsAuth.SetAuthCookie,但出现了上述问题。

如何呈现表单?您使用的是Html.Form还是Ajax.Form?如果您使用Ajax.Form(甚至是Ajax.ActionForm),您可以将登录信息发送到控制器,而无需重定向,并在客户端返回回调后决定何时重定向或不重定向。不需要服务,身份验证状态在服务器端设置并传播到客户端


如果您想尝试这种方法,我有一个完整的代码来实现这一点。我决定不以正确的方式展示它,因为这可能是您的架构上的一个相当大的变化,您可能不想这样做。如果您愿意,我将在这里发布。

只需使用jQuery调用您的控制器方法即可

$(“#登录按钮”)。单击(函数(){
$.ajax({url://Controller/CreateAsync“, 数据:{电子邮件:someone@somewhere.com", 密码:“asdfasfd”},键入:“POST”, 数据类型:“json”,
成功:功能(数据){ //做点什么
})})

有关文档,请参见此处。
哦,没关系。实际上,您应该使用FormsAuthentication.Authenticate()而不是RedirectFromLoginPage


如果您想将该方法作为JSON请求调用,则需要自己实现此行为。

在发布.NET 4/VS2010和ajax库时,他们似乎对Sys.Services命名空间做了突破性的更改…我自己无法理解…我使用的是ajax.Form。您在c中调用什么来进行身份验证ontroller?我已经完成了你所说的大部分工作,但是FormsAuthentication.RedirectFromLoginPage显然会自动执行重定向。重定向会破坏我的返回响应流,Ajax帖子最终因JS异常而失败(MS Ajax脚本不知道如何解析)。我对这个问题做了更多的澄清。