วิธีการเขียน“ Html. BeginForm” ใน Razor


133

ถ้าฉันเขียนแบบนี้:

form action = "รูปภาพ" method = "post" enctype = "multipart / form-data"

มันได้ผล.

แต่ใน Razor ที่มี "@" จะใช้ไม่ได้ ฉันทำผิดอะไรหรือเปล่า?

@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>
}

ตัวควบคุมของฉันมีลักษณะดังนี้:

[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");
}

การกระทำเป็น "รูปภาพ" จริงหรือ "อัปโหลด / อัปโหลด"
J. Steen

จริงๆแล้วฉันมีตัวควบคุมสองตัว ตัวควบคุมภาพที่มีการกระทำ 'รูปภาพ' .. และตัวควบคุมการอัปโหลด 'พร้อมการดำเนินการอัปโหลด ..
kk-dev11

คำตอบ:


200

รหัสต่อไปนี้ใช้งานได้ดี:

@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>
}

และสร้างตามที่คาดไว้:

<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>

ในทางกลับกันหากคุณกำลังเขียนโค้ดนี้ภายในบริบทของโครงสร้างฝั่งเซิร์ฟเวอร์อื่นเช่นifหรือforeachคุณควรลบ@ก่อนหน้าไฟล์using. ตัวอย่างเช่น:

@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>
    }
}

เท่าที่เกี่ยวข้องกับรหัสฝั่งเซิร์ฟเวอร์ของคุณนี่คือวิธีดำเนินการ :

[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
ขอบคุณ ดูตัวควบคุมที่ฉันอัปเดตในคำถามของฉัน ใช้ไม่ได้กับ Razor code ..
kk-dev11

2
@ user1076915 มันไม่ได้หมายถึงอะไร คุณสามารถระบุให้เจาะจงมากขึ้นได้ไหม ฉันได้อัปเดตคำตอบของฉันด้วยโค้ดตัวอย่างว่าการทำงานของคอนโทรลเลอร์ของคุณจะเป็นอย่างไร หากคุณไม่สามารถรับไฟล์ที่อัปโหลดในการดำเนินการของคอนโทรลเลอร์ซึ่งอาจหมายความว่าคุณมี<form>แท็กซ้อนกัน(ซึ่งไม่ได้รับอนุญาตใน HTML) หรือคุณอาจใช้จาวาสคริปต์บางตัวที่ลักลอบส่งแบบฟอร์มปกติและส่งคำขอ AJAX ซึ่งไม่ได้ ไม่ทำงานกับการอัปโหลดไฟล์
Darin Dimitrov

ฉันใช้แอคชั่นคอนโทรลเลอร์ของคุณและมีดโกน '@using' .. แต่มันแสดง -> คำอธิบาย: HTTP 404 ทรัพยากรที่คุณกำลังมองหา (หรือหนึ่งในการอ้างอิง) อาจถูกลบออกมีการเปลี่ยนชื่อหรือเป็น ปิดให้บริการชั่วคราว. โปรดตรวจสอบ URL ต่อไปนี้และตรวจสอบว่าสะกดถูกต้อง
kk-dev11

@ user1076915 คุณได้รับข้อความแสดงข้อผิดพลาดนี้เมื่อใด เมื่อคุณต้องการสร้างแบบฟอร์มการอัปโหลดหรือเมื่อคุณส่งแบบฟอร์ม? ในกรณีแรกให้แน่ใจว่าคุณมีGETการดำเนินการอัปโหลดที่จะให้บริการมุมมองที่มีรหัสนี้:Upload.cshtml public ActionResult Upload() { return View(); }ดังนั้นตรวจสอบให้แน่ใจว่าคุณมีตัวควบคุมที่เรียกว่าUploadControllerซึ่งมีการดำเนินการอัปโหลดสองรายการ: ตัวหนึ่งสำหรับให้บริการแบบฟอร์มและอีกตัวสำหรับประมวลผลการส่ง
Darin Dimitrov

2
ใช้งานได้ แต่ในบริบท POST ฉันขอแนะนำให้เพิ่ม: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.