Tải lên tệp MVC 3 và ràng buộc mô hình


91

Tôi có một tải lên biểu mẫu hoạt động nhưng tôi muốn chuyển thông tin mô hình cho cơ sở dữ liệu của mình để lưu tệp với tên khác tất nhiên.

Đây là chế độ xem Razor của tôi:

@model CertispecWeb.Models.Container

@{
  ViewBag.Title = "AddDocuments";
}

<h2>AddDocuments</h2>

@Model.ContainerNo

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, 
            new { enctype = "multipart/form-data" }))
{
    <input type='file' name='file' id='file' />
    <input type="submit" value="submit" />
}

Đây là Bộ điều khiển của tôi:

[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
     if (file.ContentLength > 0)
     {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/Uploads"),
                       containers.ContainerNo);
        file.SaveAs(path);
     }

     return RedirectToAction("Index");
}

Thông tin mô hình không được chuyển đến bộ điều khiển. Tôi đã đọc rằng tôi có thể cần cập nhật mô hình, tôi sẽ làm điều này như thế nào?


2
Tham khảo stackoverflow.com/questions/9411563/… để biết sự cố liên quan
LCJ 20/12/12

Câu trả lời:


123

Biểu mẫu của bạn không chứa bất kỳ thẻ đầu vào nào ngoài tệp nên trong hành động trình điều khiển của bạn, bạn không thể mong đợi nhận được bất kỳ thứ gì khác ngoài tệp đã tải lên (đó là tất cả những gì đang được gửi đến máy chủ). Một cách để đạt được điều này là bao gồm một thẻ ẩn chứa id của mô hình, thẻ này sẽ cho phép bạn truy xuất nó từ kho dữ liệu của mình bên trong hành động trình điều khiển mà bạn đang đăng lên (sử dụng thẻ này nếu người dùng không được phép sửa đổi mô hình nhưng chỉ cần đính kèm một tệp):

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.HiddenFor(x => x.Id)
    <input type="file" name="file" id="file" />
    <input type="submit" value="submit" />
}

và sau đó trong hành động điều khiển của bạn:

[HttpPost]
public ActionResult Uploadfile(int id, HttpPostedFileBase file)
{
    Containers containers = Repository.GetContainers(id);
    ...
}

Mặt khác, nếu bạn muốn cho phép người dùng sửa đổi mô hình này thì bạn sẽ cần bao gồm các trường đầu vào thích hợp cho từng trường của mô hình mà bạn muốn được gửi đến máy chủ:

@using (Html.BeginForm("Uploadfile", "Containers", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.TextBoxFor(x => x.Prop1)
    @Html.TextBoxFor(x => x.Prop2)
    @Html.TextBoxFor(x => x.Prop3)
    <input type="file" name="file" id="file" />
    <input type="submit" value="submit" />
}

và sau đó bạn sẽ có trình kết dính mô hình mặc định tái tạo lại mô hình này từ yêu cầu:

[HttpPost]
public ActionResult Uploadfile(Container containers, HttpPostedFileBase file)
{
    ...
}

1
Tôi cũng nhận được filenhư nullRequest.Files.Countlà 0, sẽ có bất kỳ sự khác biệt nào nếu formlà một AjaxFormvà cũng có routeValues?
bjan

8

Đã giải quyết

Mô hình

public class Book
{
public string Title {get;set;}
public string Author {get;set;}
}

Bộ điều khiển

public class BookController : Controller
{
     [HttpPost]
     public ActionResult Create(Book model, IEnumerable<HttpPostedFileBase> fileUpload)
     {
         throw new NotImplementedException();
     }
}

Và xem

@using (Html.BeginForm("Create", "Book", FormMethod.Post, new { enctype = "multipart/form-data" }))
{      
     @Html.EditorFor(m => m)

     <input type="file" name="fileUpload[0]" /><br />      
     <input type="file" name="fileUpload[1]" /><br />      
     <input type="file" name="fileUpload[2]" /><br />      

     <input type="submit" name="Submit" id="SubmitMultiply" value="Upload" />
}

Lưu ý tiêu đề của tham số từ hành động của bộ điều khiển phải khớp với tên của phần tử đầu vào IEnumerable<HttpPostedFileBase> fileUpload->name="fileUpload[0]"

fileUpload phải phù hợp với


2
Giải pháp này là giải pháp duy nhất tôi tìm thấy cho nhiều tệp. Cảm ơn vì đã chia sẻ mã của bạn.
Rojan Gh.

6

Nếu không phải lúc nào bạn cũng có hình ảnh đăng cho hành động của mình, bạn có thể làm như sau:

[HttpPost]
public ActionResult Uploadfile(Container container, HttpPostedFileBase file) 
{
    //do container stuff

    if (Request.Files != null)
    {
        foreach (string requestFile in Request.Files)
        {
            HttpPostedFileBase file = Request.Files[requestFile]; 
            if (file.ContentLength > 0)
            {
                string fileName = Path.GetFileName(file.FileName);
                string directory = Server.MapPath("~/App_Data/uploads/");
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                string path = Path.Combine(directory, fileName);
                file.SaveAs(path);
            }
        }
    }

} 

1

Đối với nhiều tệp; lưu ý thuộc tính " nhiều " mới hơn cho đầu vào:

Hình thức:

@using (Html.BeginForm("FileImport","Import",FormMethod.Post, new {enctype = "multipart/form-data"}))
{
    <label for="files">Filename:</label>
    <input type="file" name="files" multiple="true" id="files" />
    <input type="submit"  />
}

Bộ điều khiển:

[HttpPost]
public ActionResult FileImport(IEnumerable<HttpPostedFileBase> files)
{
    return View();
}

1

Lần đầu tiên tải xuống tệp jquery.form.js từ url bên dưới

http://plugins.jquery.com/form/

Viết mã dưới đây trong cshtml

@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data", id = "frmTemplateUpload" }))
{
    <div id="uploadTemplate">

        <input type="text" value="Asif" id="txtname" name="txtName" />


        <div id="dvAddTemplate">
            Add Template
            <br />
            <input type="file" name="file" id="file" tabindex="2" />
            <br />
            <input type="submit" value="Submit" />
            <input type="button" id="btnAttachFileCancel" tabindex="3" value="Cancel" />
        </div>

        <div id="TemplateTree" style="overflow-x: auto;"></div>
    </div>

    <div id="progressBarDiv" style="display: none;">
        <img id="loading-image" src="~/Images/progress-loader.gif" />
    </div>

}


<script type="text/javascript">

    $(document).ready(function () {
        debugger;
        alert('sample');
        var status = $('#status');
        $('#frmTemplateUpload').ajaxForm({
            beforeSend: function () {
                if ($("#file").val() != "") {
                    //$("#uploadTemplate").hide();
                    $("#btnAction").hide();
                    $("#progressBarDiv").show();
                    //progress_run_id = setInterval(progress, 300);
                }
                status.empty();
            },
            success: function () {
                showTemplateManager();
            },
            complete: function (xhr) {
                if ($("#file").val() != "") {
                    var millisecondsToWait = 500;
                    setTimeout(function () {
                        //clearInterval(progress_run_id);
                        $("#uploadTemplate").show();
                        $("#btnAction").show();
                        $("#progressBarDiv").hide();
                    }, millisecondsToWait);
                }
                status.html(xhr.responseText);
            }
        });

    });


</script>

Phương pháp hành động: -

 public ActionResult Index()
        {
            ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

            return View();
        }

 public void Upload(HttpPostedFileBase file, string txtname )
        {

            try
            {
                string attachmentFilePath = file.FileName;
                string fileName = attachmentFilePath.Substring(attachmentFilePath.LastIndexOf("\\") + 1);

           }
            catch (Exception ex)
            {

            }
        }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.