2014-02-22 220 views
3

我的控制器上傳與MVC HttpPostedFileBase文件== NULL

public ActionResult Edit(int id) 
{ 
    return this.EditDefault(id); 
} 

[HttpPost] 
public ActionResult Edit(int id, Models.Company model) 
{ 
    return this.EditDefault(id, model); 
} 

我的模型

pulbic class Company 
{ 
    ... Many other Propeties 
    public HttpPostedFileBase File { get; set; } 
} 

我查看

@using (Html.BeginForm(new { enctype = "multipart/form-data" })) 
{ 
    ... Many other Properties 
    @Html.TextBoxFor(m => m.File, new 
    { 
     type = "file", style = "display:none" 
    }) 
    ... Submit 
} 

所以我現在的問題是,當我提交頁面模型中的信息是正確的,但是文件屬性仍然爲空。

我發現了一些解決方案,人們在控制器中添加了HttpPostedFileBase作爲參數(嘗試它不起作用),但是我想避免這種情況,因爲模型和控制器都是用T4生成的。那麼有人知道爲什麼File Property始終爲空?

會很高興一些幫助:)

更新:找到了解決辦法THX馬特泰伯。

對我來說,解決方案看起來像這樣,因爲我使用共享編輯頁面。 javascript部分是爲了隱藏實際的文件上傳元素,並使用span來代替,因爲文件上傳不適合樣式。

//Shared Part 
@{ 
    RouteData routeData = this.ViewContext.RouteData; 
    string currentController = routeData.GetRequiredString("controller"); 
} 

@using (Html.BeginForm("Edit", currentController, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    //Special Part 
    ... Many other Properties 
    //File upload which is hidden 
    @Html.TextBoxFor(m => m.File, new 
    { 
     type = "file", style = "display:none" 
    }) 
    //Span which forwards the clicks to the file upload 
    <span id="fake-file-name">Kein Bild</span> 
    ... Submit 
} 

<script type="text/javascript"> 
    $(function() { 
     //forward the click from the span to the file upload 
     $("#fake-file-name").click(function() { 
      $("#File").click(); 
     }); 
     //display the chosen file name to the user with the styled span 
     $("#File").bind('change', function() { 
      //we don't want the C:\fakepath to show 
      var displayFileName = this.value.replace("C:\\fakepath\\", ""); 
      $("#fake-file-name").text(displayFileName); 
     }); 
    }); 
</script> 

回答

6

你需要指定表格的方法後

@using (Html.BeginForm("Edit", "CONTROLLER", null,FormMethod.Post, new { enctype = "multipart/form-data" })) 
3
@Html.TextBoxFor(m => m.File, new 
{ 
    type = "file", style = "display:none" 
}) 

而是有一個輸入類型的文件,如下圖所示 -

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

PS:名稱應匹配模型屬性名。

UPDATE 刪除顯示:無從您的代碼,它應該工作的罰款。

+0

THX但嘗試過了,不起作用。 順便說一下這樣的: @ Html.TextBoxFor(M => m.File,新 { 類型= 「文件」,風格= 「顯示:無」 }) 生成此 <輸入的ID = 「文件」 名稱= 「File」style =「display:none」type =「file」value =「」> 所以幾乎相同 – Unavi

+0

當你移除display:none樣式並試一試時會發生什麼? – user3341571

+0

試圖刪除顯示:無。還是行不通。 – Unavi