2009-02-13 22 views
15

null: Denetleyici olarakYüklenen HttpPostedFile View üzerinde

<% =Html.BeginForm("About", "Home", FormMethod.Post, new {enctype="multipart/form-data "})%> 
    <input type="file" name="postedFile" /> 
    <input type="submit" name="upload" value="Upload" /> 
<% Html.EndForm(); %> 

böyle bir şey var:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult About(HttpPostedFile postedFile) 
{ 
    //but postedFile is null 
    View(); 
} 

postedFile null Hakkında(). Dosyayı nasıl yüklerim?

+3

Sadece aynı problemle karşılaşan herkesi farkettim .. Buradaki asıl problem 'enctype = 'multipart/form-data'' nitelik değerinin sonunda bir boşluk var ve bana inanıyor, Firefox bunu varsayılan hesap türü. Kromda fark etmeyeceksin. Aynı problemle karşı karşıya kaldım ve bu ekstra boşluğun yerini tespit edip çıkardığımda her şey yolunda gitti ..! Umarım birisinin birkaç dakikasını kurtaracaktır ..! –

+1

ödeme [Scott Hansleman's'ın blog girişi] (http://www.hanselman.com/blog/ABackToBasicsCaseStudyImplementingHTTPFileUploadWithASPNETMVCIncludingTestsAndMocks.aspx) – Matthew

cevap

7

Bu, parametrenizin neden boş olduğunu yanıtlamaz, ancak doğrudan isteğinizi girebilirsiniz. Bu, bunu yapmanın en "MVC" yolu olmayabilir. senin yöntem vücutta bu deneyin:

var upload = Request.Files["postedFile"] 
if (upload.ContentLength > 0) 
{ 
    // Do whatever 
} 

fazla olması için "MVC," Bir IModelBinder uygulanması halinde denetleyici dışına bu kodu çekin ve yönteme parametre olarak özel bir nesnesi kullanılarak başladı. Bu , özel ModelBinder uygulama adımları gösterir.

1

Ayrıca <%= Html.BeginForm ...%> ile bazı tuhaflıklar alıyorum. Yani, kullanıyorum. Yine, Denetleyici tarafında, yüklenen dosyalarımı istek nesnesinden aldım.

Bunu deneyin. Bu çalışır:>

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Post(FormCollection form) 
    { 
     HttpPostedFileBase postedFile = Request.Files["PostedFile"]; 
     return RedirectToAction("Index"); 
    } 
+0

postedFile hala boş –

+0

Sadece denetleyicimin eylemini kopyala ve görüntüle eylemi ve görünümü. Benim için çalışıyor. Benim eylem yöntemimin HttpPostedFile argüman olarak almadığını unutmayın. –

2

kullandığınız MVC sürümü

<% using (Html.BeginForm("Post", "Home", FormMethod.Post, new {enctype = "multipart/form-data"})) 
    {%> 

    <input type="file" id="postedFile" name="PostedFile" /> 
    <input type="submit" /> 

<% 
} 

%? Şu anda RC adayı ile HttpPostedFile kullanmayı denedim ve "boş bir yapıcı hatası yok" aldım. HttpPostedFileBase kullanmalıyım.

Daha da önemlisi, sürümüne bağlı olarak, yayınlanan bir dosyanın nasıl farklı olacağına bağlı olarak, üzerinde çalıştığınız MVC sürümü.

27

HttpPostedFileBase'i (HttpPostedFile değil) kullanın ve parametreyi de tam olarak formdaki gibi adlandırın. Örneğin. Eğer

<input type="file" id="file1" name="file1" /> 

varsa yöntem kafasını olması gerekir:

aynı problem vardı
public ActionResult About(HttpPostedFileBase file1) 
+0

Ve kimlik ve ad aynı doğru olması gerekiyor? –

+1

aslında sadece isim zorunludur (ve yöntem parametreleri adına uygun olmalıdır). Kimlik sadece javascript ve css (basitleştirilmiş) tarafından kullanılır. –

+2

Tam olarak aynı sorunu yaşadım ve eylem parametresi türünü "HttpPostedFile" ile "HttpPostedFileBase" arasında değiştirdiğimde çalıştı. Yani bu öneri vurgulanmalıdır. –

4

:

Sen girdi elemanı için bir isim VE id tanımlamak zorunda:

<input type="file" name="postedFile" id="postedFileId" /> 

Saygılarımızla

Stefan

Sen enctype özelliğinin ucundan boşluk kaldırmalısınız
3

:

new {enctype="multipart/form-data "} => new {enctype="multipart/form-data"} 
2

"multipart/form-data" dan sonra boş bir alan asıl mesele olduğunu ... Eğer

2

kullanıyor jQuery mobil?evet, sen Ayrıca sahte

new { enctype = "multipart/form-data", @data_ajax = "false" } 
1

için @data_ajax ayarlamak gerekir, ben formu beyan ettiği dosya yükleme yalanlar hep

new {enctype="multipart/form-data"} 
2

kullanımını bu

olması gerektiğini bulduk
public ActionResult Upload(HttpPostedFileBase excelfile) 

İşte HttpPostedFileBase

1

için değişiklik HttpPostedFile hepsi bit Formunuza encType="multipart/form-data" ekle dosyayı

//in your model 
public partial class Profile 
{ 
    [DisplayName("Image Upload")] 
    [DataType(DataType.Upload)] 
    public HttpPostedFileBase FileUpload { get; set; } 
} 



// in your view 
@model ProjName.Blabla.Profile 

@using (Html.BeginForm("Edit", "Profile", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <input type="file" name="FileUpload" id="FileUpload" value="Choose File" class="form-control" /> 

    <input type="submit" value="Save" class="btn btn-default" /> 
} 
0
<form id="Form1" method="post" encType="multipart/form-data" runat="server"> 

uplaod gerekir.