Как сохранить тип ввода = значение поля файла после неудачной проверки в ASP.NET MVC? - PullRequest
60 голосов
/ 09 июня 2009

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

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

ТИА!

Ответы [ 7 ]

57 голосов
/ 09 июня 2009

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

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

2 голосов
/ 09 июня 2009

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

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

1 голос
/ 24 мая 2017

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

1 голос
/ 03 декабря 2014

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

1 голос
/ 01 января 2012

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

0 голосов
/ 24 октября 2017

Я не согласен с тем, что «невозможно» помечается как правильный ответ. В случае, если кто-то все еще ищет возможность, вот обходной путь, который работал для меня. Я использую 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>
}
0 голосов
/ 16 января 2015

Вы не можете установить значение поля ввода файла 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 } ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...