【问题标题】:form submit doesn't reach controller method表单提交未到达控制器方法
【发布时间】:2015-03-09 17:52:16
【问题描述】:

我正在使用 form.submit() 从 ASP.NET MVC (3) 站点下载文件。 大多数情况下它工作得很好,但在某些用例(总是相同的)中,它甚至无法到达控制器。

这是基本的 javascript 代码:

var url = "/Correspondence/LoadAttachment/";
        var form = $('<form id="RemoveMe" action="' + url + '" method="post" style="display: none;"></form>');
        var referenceId = Case.CurrentCase.CaseReferenceId.ReferenceId;
        var username = Case.CurrentCase.CustomerData.CorrespondenceData.Username;
        var caseId = Case.CurrentCase.Id;
        var token = new Date().getTime();
        var fileDownloadCheckTimer;

        form.append('<input name="mailId"       value="' + mid + '" />');
        form.append('<input name="fileName"     value="' + fileName + '" />');
        form.append('<input name="username"     value="' + username + '" />');
        form.append('<input name="caseId"     value="' + caseId + '" />');
        form.append('<input type="hidden"     name="downloadToken" value="' + token + '" />');


        form.submit();

这是基本的控制器代码:

[ValidateInput(false)]
        public ActionResult LoadAttachment()
        {
            try
            {
                uint mailId;
                UInt32.TryParse(Request.Form["mailId"], out mailId);
...

                return new FileContentResult(attachment.BinaryContent, attachment.ContentType)
                {
                    FileDownloadName = attachment.Filename
                };
            }
            catch (Exception ex)
            {
                Logger.LogErrorMessage(() => ex.ToString());
                return Json("");
            }
        } 

现在,即使我在失败的用例中为一个用例正常工作的表单中输入了相同的值,它仍然会失败。所以问题一定出在其他地方。但我无法弄清楚我的生命在哪里......

顺便说一句,问题在 Chrome 和 FireFox 浏览器中重现

【问题讨论】:

    标签: javascript asp.net .net asp.net-mvc


    【解决方案1】:

    如果这是作为 POST 完成的,您需要使用 HttpPost 属性如下:

    [HttpPost]
    public ActionResult LoadAttachment()
    {
    ...
    }
    

    如果您发现您没有在 Request.Form 中获取您的值,那么您可以随时尝试在您的方法中使用 FormCollection 作为参数,然后使用字符串索引来检索字段的值。

    [HttpPost]
    public ActionResult LoadAttachment(FormCollection formCollection)
    {
        string name = formCollection["Name"];
    }
    

    健脑食品

    Some best Practices for MVC

    Securing your MVC4 App Article

    【讨论】:

    • 感谢您的回答,但是... 1. HttpPost 没有帮助。 2. 我从请求表中读取值没有问题。请求根本没有到达控制器,正如我仅针对特定情况提到的那样
    • @omerschleifer 我能问一下您为什么不使用 @Html.BeginForm(){} 帮助器来构建您的表单吗?你想让我链接到一些例子吗?
    • 表单是在客户端动态生成的,无法在服务端使用razor提前创建
    • 在这种情况下,我不认为这是 MVC 路由的问题,并且提交未发布我认为您没有在 JavaScript 中正确构建表单。
    • 您能在加载页面源的情况下编辑答案吗?请在此处填写表单
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多