mvc表单提交为get而不是post

时间:2016-10-06 13:35:18

标签: c# asp.net-mvc-5

客户报告我的mvc应用程序中的搜索功能在第一次尝试时没有返回任何结果,但在第二次搜索时使用相同的搜索字符串给出结果。

经过一番挖掘后,我发现如果你打开页面几分钟(2-5分钟),搜索功能会提交一个GET请求而不是一个POST请求,从而产生一个值为NULL的搜索字符串。

经过长时间的搜索,我还没有找到答案。搜索功能在积极使用应用程序时可以正常工作和发布,但是暂停一段时间并且不再发布,这对我的客户来说非常烦人。

这里有以下形式:

@using (Html.BeginForm("Search", "Student", FormMethod.Post, new { @class = "navbar-form-custom", style = "width:350px;" }))
                        {
                                <input type="text" id="search" name="search" class="form-control" style="height: 43px; width: 300px; border-radius: 5px; padding: 5px; height: 40px; margin-top:5px; border: 2px solid #e6e6e6;" placeholder="Search student" required>
                        }

和行动:

public ActionResult Search(string search)
    {
        return View(_repo.SearchStudent(search));
    }

我已将[HttpPost]添加到操作中,这只会在GET触发时导致404错误。

现在我已经解决了#39;将表单切换为FormMethod.Get的问题似乎有用,虽然添加查询字符串并不理想。

我仍然在寻找一个合适的解决方案,因为我怀疑应用程序上的其他表单显示了类似的行为(错误报告变更未保存而没有错误,其他行为抛出空异常,当他们真的不应该这样做时,等)

之前我做过类似的项目,从未遇到过这种行为。这可能是IIS问题还是设置相关?

编辑:找到了罪魁祸首。显然用户的会话超时。这导致重定向到&#39; \ Account \ Login?ReturnUrl =&#34;学生/搜索&#34;&#39;。由于应用程序使用SSO会话,因此用户立即重新登录,从不会注意到。然后,返回URL作为GET请求进行访问,该请求解释了从POST到GET的突然切换。将表单切换为GET修复了问题,因为searchterm作为查询字符串传递,因此登录后不会丢失。但这会造成严重问题,并解释了许多有关未保存数据的错误报告。

之前从未遇到过这样的问题,但不知何故,这个应用程序的会话长度似乎很短。一直在寻找一个设置,但在配置文件中找不到任何东西(项目的初始阶段是与前同事一起制作的,托管不是由我管理的)

编辑2:嗯,现在我只是觉得自己像个白痴。忽略默认的Startup.Auth.cs文件

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            },
            ExpireTimeSpan = TimeSpan.FromMinutes(5) //<<DUH OBVIOUSLY
        });            
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
当我注意到在一段时间后出现问题时,

应该是我看到的第一个地方。

我的不好

1 个答案:

答案 0 :(得分:1)

只有默认路线,您的代码才能正常工作。如果您未在路线配置中拨打MapHttpAttributeRoutes[HttpPost]将不执行任何操作。默认路由配置使用操作名称来确定正在使用的HTTP谓词。将您的操作名称更改为PostSearch,它将使用POST。同样,GetSearch将使其响应GET请求。