【问题标题】:File Upload Progress Bar with Multiple and Different Inputs(MVC)具有多个不同输入的文件上传进度条(MVC)
【发布时间】:2020-04-30 20:49:48
【问题描述】:

我在互联网上搜索了这个 JavaScript 和 jQuery 模板,用于文件上传进度条,它可以 100% 正常工作(因为您只使用一个表单输入)。

我的情况是我需要将一个文件和 4 个其他输入(如文本)传递给控制器​​操作。动作效果很好。我的问题是通过 ajax 将所有这些值传递给 Action,同时保持进度条功能。

动作参数

[HttpPost]
public ActionResult Add_Attachment_to_Process(int id, int Department_id, HttpPostedFileBase Attachment, string sel_checkTask, string cbx_checkTask = null)

HTML

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

<form method="post" enctype="multipart/form-data" action="/Processes/Add_Attachment_to_Process" id="myform">
    <input type="file" id="media" name="file" />


    <div class="input-group mb-3">
        <div class="input-group-prepend">
            <div class="input-group-text">
                <input type="checkbox" aria-label="Checkbox for following text input" id="cbx_checkTask" name="cbx_checkTask">
                <span id="span_checkTask">Link Task</span>
            </div>
        </div>
        <select class="form-control" id="sel_checkTask" name="sel_checkTask" style="width : 700px;" disabled>
            @foreach (var t in Model.User_Tasks)
            {
                <option value="@t.Task_Discription">@t.Task_Discription - @t.Key_Terms</option>
            }
        </select>
    </div>

    <input id="id" name="id" value="@ViewBag.process_id " />
    <input id="Department_id" name="Department_id" value="@ViewBag.Department_id" />

    <input type="submit" />
</form>

<div class="progress" style="width:40%">
    <div id="uploadprogressbar" class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width:0%">
        0%
    </div>
</div>

JavaScript

$(document).ready(function () {
        $("#myform").on('submit', function (event) {
            event.preventDefault();

            var formData = new FormData($("#myform")[0]);

            $.ajax({
                xhr: function () {
                    var xhr = new window.XMLHttpRequest();
                    xhr.upload.addEventListener('progress', function (e) {

                        if (e.lengthComputable) {

                            console.log('Bytes Loaded: ' + e.loaded);
                            console.log('Total Size: ' + e.total);
                            console.log('Percentage Uploaded: ' + ((e.loaded / e.total) * 100) + '%');

                            var percent = Math.round((e.loaded / e.total) * 100);

                            $("#uploadprogressbar").html(percent + '%');
                            $("#uploadprogressbar").width(percent + '%');
                        }

                    });
                    return xhr;
                },
                type: 'POST',
                url: '/Processes/Add_Attachment_to_Process',
                data: formData,
                processData: false,
                contentType: false,
                success: function () {
                    alert('File Uploaded');
                },
                error: function (xhr, status, error) {
                    var errorMessage = xhr.status + ': ' + xhr.statusText;
                    alert('Error - ' + errorMessage);
                }
            });
        });
    });

【问题讨论】:

  • 有什么问题?
  • 当我使用多个输入时,进度条工作,但没有调用动作。
  • “formData”的结果是什么?您使用的是 .net 核心吗?
  • 不,我没有使用核心。请告知如何获得'formData'的结果。
  • 在'var formData = new FormData($("#myform")[0]);'下面添加'console.log(formData)'

标签: javascript jquery html ajax asp.net-mvc


【解决方案1】:

根据上面的讨论,尝试这种模式以更好地查看未发送的值

let f = new FormData();
    f.append('id', getYouFormValue("id"));
    f.append('sel_checkTask', getYouFormValue("sel_checkTask"));
    f.append('cbx_checkTask ', getYouFormValue("cbx_checkTask "));
    if (form.File) {
        f.append('File', getYouFormValue("file"));
    }
    const requestOptions = {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: f
    }

    return fetch(`/Processes/Add_Attachment_to_Process`, requestOptions)
        .then(handleResponse)
        .then(result => {
           //do stuff
        });

function handleResponse(response) {
    return response.text().then(text => {
        const data = text && JSON.parse(text);
        if (!response.ok) {
            if (response.status === 401) {
                console.log('not logged in')
            }
            const error = (data && data.message) || data.title || response.statusText;
            return Promise.reject(error);

        }
        return data;
    });
}

function getYouFormValue(element){
    let val  = document.getElementById(element);
    if(!val){
        console.log('empty value');
        return null;
    }

    return val;

}

【讨论】:

  • 哇,太棒了,谢谢。一个问题:getYouFormValue() 是现有函数还是用户创建的?
  • 在我的应用程序中,将一个对象传递给我调用的提交函数,但您正在处理提交事件,因此您必须创建一个函数来获取表单值你的形式。
  • 感谢您的帮助。在接下来的情况下,我肯定会考虑上面的 JavaScript 代码。似乎将文件输入重命名为正确的名称解决了问题。
  • @JohannesKarsten 没问题,如果有帮助,请考虑为答案投票
  • 我会接受这个答案作为解决问题的答案,因为我的水平还不够高,无法投票。
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 2015-07-01
  • 2011-10-07
  • 1970-01-01
  • 2012-07-17
  • 2018-06-30
  • 2015-10-19
  • 1970-01-01
相关资源
最近更新 更多