रेजर में "Html.BeginForm" कैसे लिखें


133

अगर मैं ऐसा लिखूं:

प्रपत्र क्रिया = "चित्र" विधि = "पोस्ट" enctype = "मल्टीपार्ट / फॉर्म-डेटा"

यह काम करता हैं।

लेकिन '@' के साथ रेजर में यह काम नहीं करता है। क्या मैंने कोई गलती की?

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

क्या क्रिया वास्तव में "चित्र" है या यह "अपलोड / अपलोड" है?
जे। स्टीन

वास्तव में मेरे पास दो नियंत्रक हैं। इमेज कंट्रोलर 'इमेज' एक्शन के साथ .. और अपलोड कंट्रोलर 'अपलोड एक्शन के साथ ..
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
धन्यवाद। मेरे प्रश्न में अद्यतन किए गए नियंत्रक को देखें। यह रेजर कोड के साथ काम नहीं करता है ..
kk-dev11

2
@ user1076915, इसका क्या मतलब नहीं है ? क्या आपके द्वारा कुछ अधिक विशिष्ट हुआ जा सकता है। मैंने अपने उत्तर को एक नमूना कोड के साथ अद्यतन किया है कि आपकी नियंत्रक कार्रवाई कैसे दिख सकती है। यदि आप नियंत्रक क्रिया में अपलोड की गई फ़ाइल प्राप्त करने में असमर्थ हैं, जिसका अर्थ हो सकता है कि आपके पास नेस्टेड <form>टैग (जो HTML में अनुमति नहीं है) या आप कुछ जावास्क्रिप्ट का उपयोग कर रहे होंगे जो सामान्य फॉर्म सबमिशन को हाईजैक करता है और एक AJAX अनुरोध करता है जो doesn फ़ाइल अपलोड के साथ टी काम करते हैं।
डारिन दिमित्रोव

मैंने आपकी कंट्रोलर एक्शन और रेज़र '@use' का उपयोग किया है .. लेकिन यह प्रदर्शित करता है -> विवरण: HTTP 404. आप जिस संसाधन की तलाश कर रहे हैं (या उसकी किसी एक निर्भरता को) हटाया जा सकता था, उसका नाम बदल गया था, या अस्थाई रूप से अनुपलब्ध। कृपया निम्न URL की समीक्षा करें और सुनिश्चित करें कि यह सही ढंग से लिखा गया है।
kk-dev11

@ user1076915, आपको यह त्रुटि संदेश कब मिलता है? जब आप अपलोड फॉर्म जमा करना चाहते हैं या जब आप फॉर्म जमा करते हैं? पहले मामले में सुनिश्चित करें कि आपके पास GETअपलोड कार्रवाई है जो Upload.cshtmlइस कोड वाले दृश्य की सेवा करेगी public ActionResult Upload() { return View(); }:। इसलिए सुनिश्चित करें कि आपके पास UploadControllerदो अपलोड एक्ट्स नामक एक नियंत्रक है : एक फॉर्म को परोसने के लिए और दूसरा सबमिशन प्रोसेस करने के लिए।
डारिन दिमित्रोव १२

2
काम करता है, लेकिन एक POST संदर्भ में मैं जोड़ने का सुझाव देता हूं: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.