【问题标题】:ASP.NET MVC SSL POST ErrorASP.NET MVC SSL POST 错误
【发布时间】:2010-03-22 14:58:21
【问题描述】:

我在使用 SSL 保护的 MVC (1.0) 应用程序中有一个登录页面,我有一个属性可以检查页面请求并在使用 http 请求时重定向到 https uri。这一切都有效,但是当我发布表单内容时,我收到以下错误:

参数字典包含一个 参数“rememberMe”的空条目 不可为空的类型'System.Boolean' 对于方法 'System.Web.Mvc.ActionResult 登录(系统字符串,系统字符串, 布尔值,System.String)' 在 'DAC.US.Web.Portal.Controllers.AccountController'。 使参数可选其类型 应该是引用类型或 可空类型。参数名称: 参数

这里是控制器代码...

    //
    // GET: /Account/LogOn
    [RequiresSSL]
    public ActionResult LogOn(string ReturnUrl)
    {
        if (TempData["Message"] != null)
            ViewData["Message"] = TempData["Message"];

        TempData["Message"] = null;

        ViewData["ReturnUrl"] = ReturnUrl ?? "/Home"; 

        return View();
    }

同样,RequireSSL 属性有效,但来自该 SSL uri 的 POST 无效。什么不工作?

这里是操作(POST)方法,我很抱歉没有发布。当不作为 SSL 运行时,这一切工作文件,但是当我更改为在 SSL 下运行时,POST 不再工作。

    //
    // POST: /Account/LogOn
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {
        Logger.InfoFormat("LogOn : ({0}, PASSWORD, {1}, {2}).", userName, rememberMe, returnUrl);
        if (!ValidateLogOn(userName, password))
        {
            return View();
        }

        _FormsAuthentication.SignIn(userName, rememberMe);

        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(this.Request.Url.AbsoluteUri.Replace(this.Request.RawUrl, returnUrl).Replace("https://", "http://"));
        }
        else
        {
            return Redirect(this.Request.Url.AbsoluteUri.Replace(this.Request.RawUrl, "/Home").Replace("https://", "http://"));
            //return RedirectToAction("Index", "Home");
        }
    }

表单 HTML

                        <% using (Html.BeginLogOnForm()){ %>
                            <div class="logon-row logon-sso-row">
                                <div class="logon-links-row"><a href="<%=Url.Action("SingleSignOn", "Account", new{ReturnUrl=ViewData["ReturnUrl"]}) %>">Single Sign On</a></div>
                            </div>
                            <div class="logon-row">
                                <span class="block-span logon-label-cell">User Name:</span>
                                <span class="block-span"><%= Html.TextBox("username", null, new { style = "width:150px" })%></span>
                            </div>
                            <div class="logon-row">
                                <span class="block-span logon-label-cell">Password:</span>
                                <span class="block-span"><%= Html.Password("password", null, new { style="width:150px" })%></span>
                            </div>
                            <div class="logon-row">
                                <span class="block-span logon-label-cell">Remember Me?:</span>
                                <span class="block-span"><%= Html.CheckBox("rememberMe")%></span>
                            </div>
                            <div class="logon-row logon-bottons-row">
                                <input type="submit" value="Log On" class="mainshipButton mainshipPageButton" />
                            </div>
                            <div class="logon-row">
                                <div class="logon-links-row"><a href="<%=Url.Action("Request", "Account") %>">Request Account</a></div>
                                <div class="logon-links-row"><a href="<%=Url.Action("Forgot", "Account") %>">Forgot ID/Password</a></div>
                            </div>
                        <% } %>

【问题讨论】:

    标签: asp.net-mvc ssl


    【解决方案1】:

    在谷歌搜索了几个小时后,我关闭了浏览器 (IE).. 然后尝试了 FF(它有效)。所以我重新打开了 IE 并尝试通过它,它运行良好....不确定问题是什么,但现在看起来很好

    【讨论】:

    • 勾选未选中的复选框。我的猜测是它仍然无法正常工作。
    【解决方案2】:

    听起来模型绑定器正在尝试绑定到操作方法中的不可为空的类型。您列出的操作方法没有该类型(rememberMe)。您的路线可能不会按照您的想法进行。您的某个控制器中是否有一个将 rememberMe 参数作为布尔值的操作方法?

    编辑(在附加信息添加到问题后):

    如果未选中复选框,则不会返回值。它将为空。您需要在复选框上方添加一个具有相同名称的隐藏值,如下所示:

    <input type="hidden" name="rememberMe" value="false" />
    

    或者使用可空类型 bool?。

    【讨论】:

    • 我已经更新了上面的问题,我确实有一个针对具有该参数的帖子的操作方法。当不在 SSL 中运行时,这一切都可以正常工作,一旦“需要”SSL,POST 就不再工作了。
    • 您确定 rememberMe 变量在表单集合中吗?您可以检查 Request.From 集合以确保变量存在。我没有遇到任何像您报告的 SSL 连接问题。
    • 因为它在不使用 HTTPS 协议时工作正常,所以我会说这似乎是一个 SSL 问题,但这里是 html 表单。如您所见,rememberMe 参数映射到一个复选框。 (将发布对 html 的编辑)
    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多