FileUpload:显示验证错误时保留文件名

时间:2015-01-13 03:33:59

标签: c# asp.net-mvc file-upload

我使用Asp.Net MVC在C#中有以下文件上传代码。问题是,当显示验证错误时,用户选择的所有文件都将丢失(输入框被清除)。是否可以在不使用javascript的情况下将输入文件名保留为原始顺序?什么是最简单的方法?

控制器代码

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files)
{
    //check for errors: if errors, ModelState.AddModelError(...);
    if (!ModelState.IsValid) {
        return View(files);
    }
    else {
        //..........
    }
}

查看摘要

@using (Html.BeginForm("Index", "Uploader", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div class="form-group">
        <input type="file" name="files" id="file1" />
        @Html.ValidationMessage("1")
    </div>
    <div class="form-group">
        <input type="file" name="files" id="file2" />
        @Html.ValidationMessage("2")
    </div>
    //and 2 more file input fields

    <div>
        <input type="submit" value="Upload Files" class="btn btn-success btn-lg" />
    </div>
}

2 个答案:

答案 0 :(得分:0)

在回发中,您无法保留相同的本地路径,该路径将保留在type =“file”中。

这样做认为有两种方法 1)在您当前的代码中,如果您发现任何附加的文件,则保存在服务器上并在隐藏字段中保留一些标志,并使用文本框隐藏/显示您的文件控件(仅具有文件名)  并将其发送回浏览器。然后在下一次有效提交时,获取您已保存的文件名。并完成你的过程。

2)在提交表单时,将所有html控件(文件,文本框,hidenfield等)复制(DOM复制)到一个iframe中并提交iframe。

答案 1 :(得分:0)

如果有人仍然在寻找可能性,那么这里的工作对我有用。我正在使用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>
}