Использовать одно и то же свойство ViewModel несколько раз в контроллере для загрузки другого элемента? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть свойство ContractExtention в модели представления с типом данных HttpPostedFileBase. Идея, лежащая в основе этого свойства, заключается в том, чтобы позволить пользователям загружать расширение контракта. После того, как они загрузят расширение контракта, я должен иметь доступ к информации о файле, используя свойство ContractExtention. Проблема в том, что пользователю может потребоваться загрузить более одного расширения контракта одновременно. Количество продления контракта может варьироваться.

[FileTypes("doc,DOC,docx,DOCX,pdf,PDF,jpg,jpeg,png")]
public HttpPostedFileBase ContractExtention { get; set; }
public List<amendcontract> amendcontract { get; set; }

Свойство amendcontract сообщит мне, сколько контрактов необходимо загрузить пользователю. Это код для моего взгляда:

foreach (var contract in Model.amendcontract)
    {
        if (contract.DocumentReceived)
        {
            <div class="form-group">
                @Html.Label("Contract Extention", new { @class = "control-label col-md-3" })
                <div class="col-md-offset-1 col-md-8">

                    <div class="col-sm-4 align-items-center doc" style="width:100%">
                        <div class="col-sm-2">
                            <a href='@Url.Action("viewDocument", "Intern", new { docType = "ExtendedContract",docId=contract.ContractDocumentID })'><i class="far fa-check-circle" title="View Document" style="font-size: 37.5px; color: green; "> </i></a>
                        </div>
                        <div class="col-sm-1" style="width: fit-content; top: 50%; transform: translateY(50%);">
                            <strong class="align-middle">Contract Extention for @contract.effectiveDate</strong>
                        </div>

                    </div>
                </div>
            </div>
            <hr />
        }
        else if (contract.ContractDocumentID == null)
        {

            <div class="form-group">
                @Html.Label("Contract Extention", new { @class = "control-label col-md-3" })
                <div class="col-md-offset-1 col-md-8">
                    @Html.TextBoxFor(m => m.ContractExtention, new { type = "file", @class = "extendContract", @id = "uploader" })

                    @Html.ValidationMessageFor(m => m.ContractExtention)
                </div>
            </div>
            <hr />
        }
        else
        {
            <div class="form-group">
                @Html.Label("Contract Extention", new { @class = "control-label col-md-3" })
                <div class="col-md-offset-1 col-md-8">
                    <div class="row">
                        <div class="col-sm-4 ">
                            @Html.TextBoxFor(m => m.ContractExtention, new { type = "file", @class = "extendContract", @id = "uploader" })

                            @Html.ValidationMessageFor(model => model.ContractExtention)
                        </div>
                        <!--
                        -->
                        <div class="col-sm-7 align-items-center doc">
                            <div class="col-sm-2">
                                <a href='@Url.Action("viewDocument", "Intern", new { docType = "ExtendedContract", docId = contract.ContractDocumentID })'><i class="far fa-file-pdf" style="font-size:50px; color:black"></i></a>

                            </div>
                            <div class="col-sm-8">
                                <strong class="align-middle">Contract Extention for @contract.effectiveDate</strong>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <hr />
        }
    }

Если contract.ContractDocumentID равно нулю, это означает, что пользователь не загрузил файл, иначе пользователь загрузил файл, но ожидает подтверждения. Когда пользователь получает продление контракта, он добавляется в таблицу изменений контракта. Мой код будет проходить через каждый элемент в amendcontract, и если пользователю нужно загрузить файл, он будет использовать свойство ContractExtention, чтобы позволить пользователям загружать файл. Как разрешить пользователям загружать более одного файла одновременно, используя свойство ContractExtention?

1 Ответ

0 голосов
/ 04 сентября 2018

Лучший способ загрузить несколько файлов одновременно - использовать JQuery для сопоставления всех файлов в объекте FormData, асинхронно публиковать их, а затем использовать Request.Files для получения их в действии контроллера вместо попытки использовать HttpPostedFileBase в модели представления.

Поскольку у вас есть несколько файловых входов, вам нужно будет перебрать их все и добавить каждый файл.

var data = new FormData();
$("input[type=file]").each(function(i, obj) {
                    var files = $(obj).get(0).files;
                    if (files) {
                        for (var x = 0; x < files.length; x++) {
                            data.append("file" + x, files[x]);
                        }
                    }
                });
                $.ajax({
                    url: '@Url.Action("Action", "Controller")',
                    type: 'post',
                    data: data,
                    cache: false,
                    contentType: false,
                    processData: false,
                    success: function(response) {

                    }
                });

В вашем контроллере:

for (int i = 0; i< Request.Files.Count; i++)
{
}

Вы должны быть в состоянии приспособить это к вашим потребностям.

EDIT:

Также ничего не стоит, вы можете добавить дополнительную информацию в объект FormData, если вам нужно отправить другие параметры для вашего действия:

data.append("key", "test");
data.append("value", "test");


public ActionResult Upload(string key, string value)
{
    //key = test, value = test
    var files = Request.Files; //HttpFileCollectionBase
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...