【问题标题】:MVC3 - Form + POST = empty parametersMVC3 - 表单 + POST = 空参数
【发布时间】:2012-01-13 17:56:21
【问题描述】:

我目前正在开发一个 ASP.NET MVC3 网站。

我有一个简单的身份验证表单,绑定在一个简单的视图模型上。在本地调试时,一切正常。

但是网站也必须在 Apache + monomod 上运行。这是我遇到的奇怪行为:具有相同请求和参数的相同表单无法正常工作。

更多细节:

视图模型:

/// <summary>
/// Form authentication info
/// </summary>
public class LogOnModel
{
    /// <summary>
    /// 
    /// </summary>
    [DisplayName("Username")]
    public string UserName { get; set; }

    /// <summary>
    /// 
    /// </summary>
    [DisplayName("Password")]
    public string Password { get; set; }

    /// <summary>
    /// 
    /// </summary>
    [DisplayName("Remember me?")]
    public bool RememberMe { get; set; }

    /// <summary>
    /// Targeted URL
    /// </summary>
    public string Target { get; set; }

    /// <summary>
    /// 
    /// </summary>
    public LogOnModel()
    {
    }
}

视图的主要部分,用户可以输入其用户名和密码的页面:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Website.Areas.Public.Models.LogOnModel>" %>
<p>
    Please enter your username and password to continue.
</p>
<% using (Html.BeginForm())
   { %>
<%= Html.ValidationSummary(true, "Authentication failed.")%>
<p>
    <%= Html.ActionLink("I forgot my password","PasswordRecovery","Home") %>
</p>
<div>
    <fieldset>
        <div class="editor-label">
            <%= Html.LabelFor(m => m.UserName) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(m => m.UserName) %>
            <%= Html.ValidationMessageFor(m => m.UserName)%>
        </div>
        <div class="editor-label">
            <%= Html.LabelFor(m => m.Password)%>
        </div>
        <div class="editor-field">
            <%= Html.PasswordFor(m => m.Password) %>
            <%= Html.ValidationMessageFor(m => m.Password) %>
        </div>
        <div class="editor-field">
            <%= Html.CheckBoxFor(m => m.RememberMe) %>
            Remember me
        </div>
        <p>
            <input type="submit" value="Connect me!" />
        </p>
    </fieldset>
</div>
<% } %>

和控制器,接收身份验证信息:

    [HttpPost]
    public ActionResult LogOn(LogOnModel model)
    {
        string username = model.UserName;
        string password = model.Password;

        //On Apache, username & password are empty
       ...
    }

正如我在 cmets 中所说,用户名和密码为空。在本地 ASP.NET 调试服务器上一切正常,使用 Fiddler 我可以看到身份验证请求包含表单数据(用户名、密码等)。

知道为什么绑定似乎不起作用吗? 谢谢。

【问题讨论】:

  • 嗯,我可以使用 HttpContext.Request.Form["UserName"] 等来获取值...但对我来说似乎不是很干净...

标签: apache forms asp.net-mvc-3 mono controller


【解决方案1】:

您使用的是什么版本的单声道?当我第一次尝试在单声道(2.4 或 2.6)上设置 am MVC 2 站点时遇到了这个问题。我不记得根本原因是什么,除了它是一个相当复杂的单声道错误/实现差异,该差异已被修复 - 在单声道 2.10.2 上运行的 MVC3/Razor 按预期工作。

【讨论】:

  • 我使用的是 Mono 2.10.2 和 MVC 3
  • 如果您使用 mvc 1 或 2,您的页面中是否有任何会失败的内容? Mono 程序集绑定的工作方式与 .net 不同,因此很容易使用错误的版本进行部分设置。
  • 我猜不是,我什至没有使用 Razor 视图引擎(仍在使用旧的)。似乎 Mono 上的路由与 IIS 上的路由完全不同。因为我只有一个默认路由,所以参数不匹配。
  • 路由应该是一样的(这都是在MVC程序集中),但是绑定是不同的。我建议在您的页面上添加一些代码来显示程序集版本并验证您正在运行您认为的内容。
  • 你是对的,路由是有效的,否则找不到方法...你知道如何显示这些版本吗?使用 typeof(Controller).AssemblyQualifiedName?
【解决方案2】:

几个月后才找到我的答案。有点晚了,但是如果有人有同样的问题,这里是解决方案:

清理 Web.config 文件。删除可选的每一行

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2014-02-22
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多