Подтвердить что ты не робот

Как сохранить тип ввода = значение поля файла после неудачной проверки в ASP.NET MVC?

У меня есть простая форма в приложении MVC, которое я сделал. Он содержит поле файла, чтобы пользователи могли загружать изображение. Все отлично работает.

Проблема заключается в том, что если представление формы не проходит проверку, содержимое поля файла теряется (другие поля остаются заполненными, спасибо HtmlHelpers!). Как сохранить поле файла, заполненное после неудачной проверки?

ТИА!

4b9b3361

Ответ 1

Браузеры разработаны таким образом из-за рисков безопасности. Невозможно установить значение поля ввода файла в источнике HTML или Javascript. В противном случае вредоносный script мог бы украсть какой-то частный файл без внимания пользователя.

интересная информация о предмете.

Ответ 2

Насколько я знаю, вы не можете установить значение поля ввода файла HTML. Я бы предложил связать поле ввода файла с меткой или текстовым полем.

Затем вы можете заполнить его значением из поля ввода файла, которое будет повторно отправлено позже.

Ответ 3

Существуют флеш файлы для загрузки файлов. Попробуйте один из них. Некоторые из них даже возвращаются к обычному ящику ввода файлов, если flash и java script не поддерживаются. Советую искать jQuery-плагины.

Ответ 4

Если файл не слишком большой, вы можете использовать base64 и использовать его как значение для скрытого поля.

Ответ 5

Вы не можете установить значение поля ввода файла HTML. В качестве обходного пути замените поле загрузки файла скрытым полем ввода при выводе формы после проверки.

При представлении вы заполняете скрытое поле значением из поля ввода файла (для последующего повторного представления). Не забудьте указать имя файла или имя скрытого поля в любой момент (не оба):

Примечание: Код ниже приведен только для иллюстрации/объяснения. Замените его кодом, соответствующим используемому вами языку.

<?php /* You may need to sanitize the value of $_POST['file_upload']; 
* this is just a start */
if(isset($_POST['file_upload']) && !empty($_POST['file_upload'])){ ?>
<input type="hidden" name="file_upload" value="<?php print($_POST['file_upload']); ?>" />
<?php } else { ?>
<input type="file" name="file_upload" />
<?php } ?>

Ответ 6

Я бы рекомендовал выполнить проверку заранее через ajax и выполнить частичное обновление страницы. В этом случае вы не потеряете файл.

Ответ 7

Я не согласен с "невозможным", обозначенным как правильный ответ. Если кто-то все еще ищет возможность, вот работа, которая работала для меня. Я использую MVC5. Идея заключается в использовании переменной сеанса. Я получил идею от ASP.Net Form.

Моя модель /ViewModel (только соответствующие свойства):

public partial class emp_leaves
    {
        public string fileNameOrig { get; set; }
        public byte[] fileContent { get; set; }

        public HttpPostedFileBase uploadFile { get; set; }
    }

В моем контроллере (HttpPost): // Проверка

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(emp_leaves emp_leaves)
{
    if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName))
    {
        emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName);
        emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength];
        emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);
        Session["emp_leaves.uploadFile"] = emp_leaves.uploadFile; //saving the file in session variable here
    }
    else if (Session["emp_leaves.uploadFile"] != null)
    {//if re-submitting after a failed validation you will reach here.
        emp_leaves.uploadFile = (HttpPostedFileBase)Session["emp_leaves.uploadFile"];
        if (emp_leaves.uploadFile != null && emp_leaves.uploadFile.ContentLength>0 && !string.IsNullOrEmpty(emp_leaves.uploadFile.FileName))
        {
            emp_leaves.fileNameOrig = Path.GetFileName(emp_leaves.uploadFile.FileName);
            emp_leaves.uploadFile.InputStream.Position = 0;
            emp_leaves.fileContent = new byte[emp_leaves.uploadFile.ContentLength];
            emp_leaves.uploadFile.InputStream.Read(emp_leaves.fileContent, 0, emp_leaves.uploadFile.ContentLength);    
        }
    }
//code to save follows here...
}

Наконец, в моем представлении редактирования: здесь я условно показываю элемент управления загрузкой файлов.

< script type = "text/javascript" >
  $("#removefile").on("click", function(e) {
    if (!confirm('Delete File?')) {
      e.preventDefault();
      return false;
    }
    $('#fileNameOrig').val('');
    //toggle visibility for concerned div
    $('#downloadlrfdiv').hide();
    $('#uploadlrfdiv').show();
    return false;
  }); <
/script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
@model PPMSWEB.Models.emp_leaves @{ HttpPostedFileBase uploadFileSession = Session["emp_leaves.uploadFile"] == null ? null : (HttpPostedFileBase)Session["emp_leaves.uploadFile"]; } @using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data"
})) { @Html.AntiForgeryToken()
<div class="row">
  @*irrelevant content removed*@
  <div id="downloadlrfdiv" @((!String.IsNullOrEmpty(Model.fileNameOrig) && (Model.uploadFile==n ull || uploadFileSession !=null)) ? "" : "style=display:none;")>
    <label>Attachment</label>
    <span>
            <strong>
                <a id="downloadlrf" href="@(uploadFileSession != null? "" : Url.Action("DownloadLRF", "emp_leaves", new { empLeaveId = Model.ID }))" class="text-primary ui-button-text-icon-primary" title="Download attached file">
                    @Model.fileNameOrig
                </a>
            </strong>
            @if (isEditable && !Model.readonlyMode)
            {
                @Html.Raw("&nbsp");
                <a id="removefile" class="btn text-danger lead">
                    <strong title="Delete File" class="glyphicon glyphicon-minus-sign">  </strong>
                </a>
            }
            </span>
  </div>
  <div id="uploadlrfdiv" @(!(!String.IsNullOrEmpty(Model.fileNameOrig) && Model.uploadFile==n ull) && !Model.readonlyMode ? "" : "style=display:none;")>
    <label>Upload File</label> @Html.TextBoxFor(model => model.uploadFile, new { @type = "file", @class = "btn btn-default", @title = "Upload file (max 300 KB)" }) @Html.ValidationMessageFor(x => x.uploadFile)
  </div>
</div>
}