ASP.NET MVC 文件上传传递给视图模型时为 null。

6
我有一个表单,可以将照片上传到我的数据库中,并且我使用视图模型来辅助完成这个过程。
视图模型:
public class GalleryViewModel
{
    //Members:
    public Gallery _photo                { get; set; }
    public string _title                 { get; set; }
    public string _description           { get; set; }
    public string _photographer          { get; set; }
    public HttpPostedFileBase uploadFile { get; set; }


    // Ctor
    public GalleryViewModel(Gallery photo)
    {
        _photo = photo;
    }

    public GalleryViewModel()
    {
        _photo = null;
    }
}

当我调试代码时,我发现在我的控制器中的post方法中,表单中的所有信息都被更新到视图模型中,除了上传文件uploadFile为空。在表单中,我使用enctype =“multipart / form-data”。当我使用我的主页面时,uploadFile为空,但是当我使用默认的MVC主页面时,一切正常。
这是我的主页面:
<%@ Master Language="C#" MasterPageFile="~/views/Shared/GeneralMaster.master" Inherits="System.Web.Mvc.ViewMasterPage" %>

<asp:Panel ID="notifiactions" runat="server">
   <% if (ViewData["notifications"] != null)
   { %>
        <br />       
            <table width="100%">
                <tr>
                    <td align="center">
                        <div id="messages" style="width: 90%; border: solid 1px #A3A3A3">
                            <br />     
                            <%= Html.Encode(ViewData["notifications"])%>                                
                            <br /><br />
                        </div>
                    </td>
                </tr>
            </table>   
   <% } %>    
</asp:Panel>

<br />
    <table width="100%" cellpadding="0" cellspacing="0">
        <tr>
            <td width="30%" align="center"> 
                <img src="\Content\SiteDesign\wine_in_frame2.JPG" alt="lk" />
            </td>
            <td width="40%">
                <asp:ContentPlaceHolder ID="PageContent" runat="server" />
            </td>  
            <td width="30%" align="right"> 
                <img src="\Content\SiteDesign\set_with_frame.jpg" alt="Alon" />
            </td>
        </tr>
    </table>     

这是默认的asp.net mvc主页面。
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

    <div id="header">
        <div id="title">
            <h1>My MVC Application</h1>
        </div>

        <div id="logindisplay">
            <% Html.RenderPartial("LogOnUserControl"); %>
        </div> 

        <div id="menucontainer">

            <ul id="menu">              
                <li><%= Html.ActionLink("Home", "Index", "Home")%></li>
                <li><%= Html.ActionLink("About", "About", "Home")%></li>
            </ul>

        </div>
    </div>

    <div id="main">
        <asp:ContentPlaceHolder ID="MainContent" runat="server" />

        <div id="footer">
        </div>
    </div>
</div>

任何想法?
3个回答

4

你没有发布实际的视图和表单,所以我只能猜测:

请确保将表单的enctype设置为"multipart/form-data",否则文件将无法上传。

<form id="form" name="form" action"controller/action" enctype="multipart/form-data">
...
</form>

或者使用 Html 帮助程序:

<% using(Html.BeginForm("action", "controller", "POST", new { enctype = "multipart/form-data" })) {
...
<% } %>

我正在使用以下代码: <% using (Html.BeginForm("UploadPhoto", "Gallery", FormMethod.Post, new { enctype = "multipart/form-data" })) {%>正如我所说,当我调试代码时,点击上传按钮确实调用了post方法,并且在调用UpdateModel时更新了视图模型中的所有信息,除了文件为null... - Eran

1
将此代码添加到表单中,将使表单获取多部分数据,例如附件等。
new { enctype = "multipart/form-data" }

我已经做了这个数十次,但每次都会让我犯错! - Philip Stratford

0
原来我使用的母版页继承自项目的主母版页。
在这个母版页中,有一个<form>标签包含了<asp:contentholder>。移除<form>标签解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接