Razor'da "Html.BeginForm" nasıl yazılır


133

Böyle yazarsam:

form action = "Resimler" method = "post" enctype = "multipart / form-data"

işe yarıyor.

Ancak Razor'da '@' ile çalışmıyor. Hata yaptım mı?

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

Denetleyicim şuna benziyor:

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

Eylem aslında "resimler" mi yoksa "Yükle / Yükle" mi?
J. Steen

aslında iki denetleyicim var. 'görüntü' eylemli görüntü denetleyicisi .. ve yükleme işlemiyle denetleyiciyi yükle ..
kk-dev11

Yanıtlar:


200

Aşağıdaki kod iyi çalışıyor:

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

ve beklendiği gibi üretir:

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

Öte yandan, böyle bir diğer sunucu tarafı yapı bağlamında içinde bu kod yazıyorsanız, ifya foreachda kaldırmak gerekir @önce using. Örneğin:

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

Sunucu tarafı kodunuz söz konusu olduğunda, şu şekilde devam edebilirsiniz :

[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
Teşekkürler. Sorumda güncellediğim denetleyiciye bakın. Razor koduyla çalışmıyor ..
kk-dev11

2
@ user1076915, işe yaramıyor ne anlama geliyor ? Biraz daha açık konuşabilir misin? Cevabımı, kontrolör eyleminizin nasıl görünebileceğine dair örnek bir kodla güncelledim. Yüklenen dosyayı denetleyici eyleminde alamıyorsanız, bu, iç içe <form>etiketlere sahip olduğunuz anlamına gelebilir (HTML'de buna izin verilmez) veya normal form gönderimini ele geçiren ve bir AJAX isteği yapan bir javascript kullanıyor olabilirsiniz. t dosya yüklemeleriyle çalışma.
Darin Dimitrov

Denetleyici eyleminizi ve '@ kullanılıyor' jiletini kullandım .. ama görüntüleniyor -> Açıklama: HTTP 404. Aradığınız kaynak (veya bağımlılıklarından biri) kaldırılmış, adı değiştirilmiş olabilir veya Geçici olarak kullanım dışı. Lütfen aşağıdaki URL’yi inceleyin ve doğru yazıldığından emin olun.
kk-dev11

@ user1076915, bu hata mesajını ne zaman alıyorsunuz? Yükleme formunu ne zaman oluşturmak istiyorsunuz veya formu ne zaman gönderiyorsunuz? İlk durumda bir olmasını sağlamak GETgörev yapacak Yükle eylemi Upload.cshtmlbu kodu içeren görünümü: public ActionResult Upload() { return View(); }. Bu nedenle UploadController, iki Yükleme eylemini içeren bir denetleyiciniz olduğundan emin olun : biri forma sunmak, diğeri gönderimi işlemek için.
Darin Dimitrov

2
Çalışır, ancak POST bağlamında şunu eklemenizi öneririm: @ Html.AntiForgeryToken ();
Frédéric De Lène Mirouze
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.