Cách viết bài Html.BeginForm 'trong dao cạo


132

Nếu tôi viết như thế này:

form action = "Images" method = "post" enctype = "Multipart / form-data"

nó hoạt động

Nhưng trong Dao cạo với '@' thì nó không hoạt động. Tôi đã phạm sai lầm nào chưa?

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                             new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)

    <fieldset>

        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />

    </fieldset>
}

Bộ điều khiển của tôi trông như thế này:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Upload() 
{
    foreach (string file in Request.Files)
    {
        var uploadedFile = Request.Files[file];
        uploadedFile.SaveAs(Server.MapPath("~/content/pics") + 
                                      Path.GetFileName(uploadedFile.FileName));
    }

    return RedirectToAction ("Upload");
}

Là hành động thực sự là "hình ảnh" hay là "Tải lên / Tải lên"?
J. Steen

Thật ra tôi có hai bộ điều khiển. bộ điều khiển hình ảnh với hành động 'hình ảnh' .. và bộ điều khiển tải lên 'với hành động tải lên ..
kk-dev11

Câu trả lời:


200

Các mã sau hoạt động tốt:

@using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
}

và tạo như mong đợi:

<form action="/Upload/Upload" enctype="multipart/form-data" method="post">    
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload" />
    </fieldset>
</form>

Mặt khác, nếu bạn đang viết mã này trong bối cảnh của cấu trúc phía máy chủ khác, chẳng hạn như ifhoặc foreachbạn nên loại bỏ @trước using. Ví dụ:

@if (SomeCondition)
{
    using (Html.BeginForm("Upload", "Upload", FormMethod.Post, 
                                      new { enctype = "multipart/form-data" }))
    {
        @Html.ValidationSummary(true)
        <fieldset>
            Select a file <input type="file" name="file" />
            <input type="submit" value="Upload" />
        </fieldset>
    }
}

Theo như mã phía máy chủ của bạn có liên quan, đây là cách tiến hành :

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file) 
{
    if (file != null && file.ContentLength > 0) 
    {
        var fileName = Path.GetFileName(file.FileName);
        var path = Path.Combine(Server.MapPath("~/content/pics"), fileName);
        file.SaveAs(path);
    }
    return RedirectToAction("Upload");
}

1
cảm ơn. Nhìn vào bộ điều khiển tôi cập nhật trong câu hỏi của tôi. Nó không hoạt động với mã Dao cạo ..
kk-dev11

2
@ user1076915, nó không hoạt động nghĩa là gì? Bạn có thể nêu chi tiết hơn được không. Tôi đã cập nhật câu trả lời của mình với một mã mẫu về cách hành động của bộ điều khiển của bạn có thể trông như thế nào. Nếu bạn không thể tải tệp đã tải lên trong hành động của bộ điều khiển, điều đó có nghĩa là bạn có các <form>thẻ lồng nhau (không được phép trong HTML) hoặc bạn có thể đang sử dụng một số javascript để đánh cắp việc gửi biểu mẫu thông thường và thực hiện yêu cầu AJAX không ' t làm việc với tải lên tập tin.
Darin Dimitrov

Tôi đã sử dụng hành động điều khiển của bạn và dao cạo '@USE' .. nhưng nó hiển thị -> Mô tả: HTTP 404. Tài nguyên bạn đang tìm kiếm (hoặc một trong các phụ thuộc của nó) có thể đã bị xóa, đã thay đổi tên hoặc tạm thời không có Vui lòng xem lại URL sau và đảm bảo rằng nó được viết đúng chính tả.
kk-dev11

@ user1076915, khi nào bạn nhận được thông báo lỗi này? Khi bạn muốn kết xuất biểu mẫu tải lên hoặc khi bạn gửi biểu mẫu? Trong trường hợp đầu tiên, đảm bảo rằng bạn có GEThành động Tải lên sẽ phục vụ Upload.cshtmlchế độ xem chứa mã này : public ActionResult Upload() { return View(); }. Vì vậy, hãy đảm bảo bạn có một bộ điều khiển được gọi UploadControllercó chứa hai hành động Tải lên: một để phục vụ biểu mẫu và một để xử lý việc gửi.
Darin Dimitrov

2
Hoạt động, nhưng trong ngữ cảnh POST, tôi đề nghị thêm: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze
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.