【问题标题】:File upload bound to the Viewmodel文件上传绑定到 Viewmodel
【发布时间】:2012-06-01 05:23:08
【问题描述】:

我有一个表单,我在其中上传多个文件,并且有几个文本框和一些复选框与每个正在上传的文件相关联。 我已经看到上传多个文件的示例,其中 actionresult 签名是这样的:

[HttpPost]
public ActionResult Upload(IEnumerable<HttpPostedFileBase> fileUpload)

但是,我找不到任何可以上传多个文件的示例,其中我的 actionresult 签名是这样的:

[HttpPost]
public ActionResult Upload(MyViewModel vm)

我希望发布此视图模型的原因是因为我认为它比使用 FormCollection 变量更干净,并且因为我希望上传的每个文件以及添加的数据及其关联的文本框通过 @987654323 组合在一起@ 将成为 ViewModel 的一部分

更新

我的视图模型如下:

public class EmployeeVM  
{

    public int EmployeeID {get ;set;}
    public string EmpName {get ;set;}
    //Other properties

    public List<FileUploadPacket> FileUploadPackets { get; set; }
}

具有HttpPostedFileBase类型属性的FileUploadPacket类

public class FileUploadPacket 
{

    public int FileID {get ;set;}
    public string UserEnteredDesc {get ;set;}
    //some more other properties

    public HttpPostedFileBase UpFile { get; set; }
}

我的 view.aspx 的代码 sn-p 如下

<%: Html.TextBoxFor(model => model.EmpName, new { maxLength = 50 })%>

Upload your files here: 
<input type="file" id="UpFile" name="UpFile" value="ActionHandlerForForm"  />
<%: Html.TextBoxFor(model => model.FileUploadPackets[0].UserEnteredDesc )%>

<input type="file" id="UpFile" name="UpFile" value="ActionHandlerForForm"  />
<%: Html.TextBoxFor(model => model.FileUploadPackets[1].UserEnteredDesc )%>

如您所见,我将特定于该文件的所有其他属性保存在其自己的类中。因此,在我的表格中,员工可以输入他的姓名并上传他的文件,并为每个文件提供一些描述和其他详细信息。如果我将公共HttpPostedFileBase UpFile { get; set; } 属性移动到EmployeeVM 类,那么我将不得不在一个数组中分别收集所有文件并手动将文件映射到其描述。有没有办法将UpFile 属性保留在FileUploadPacket 类本身中?

我正在使用 aspx 视图引擎。

请帮忙。感谢您的宝贵时间...

【问题讨论】:

    标签: asp.net-mvc file-upload viewmodel


    【解决方案1】:

    GetHtml 助手不是 mvc 框架的一部分,您应该查找包含该助手的第三方库。

    不过,上传属于 ViewModel 一部分的文件很简单。基本上是这样的

    定义视图模型

    public class MyViewModel 
    {
         public HttpPostedFileBase MyFile { get; set; }
    }
    

    Views/Shared/EditorTemplates内部,创建MyViewModel.cshtml

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

    和视图,对应上传动作

    @model MyViewModel
    
    @using(Html.BeginForm("Upload", "MyController", FormMethod.Post, new { enctype="multipart/form-data"})
    {
         @Html.EditorForModel()
        <input type="submit" value="Upload" />
    }
    

    必填属性对于上传文件很重要。

    就是这样,一旦提交表单,您应该会在[HttpPost] action、vm.MyFile 中看到上传的文件。

    【讨论】:

    • Highlight +1 enctype="multipart/form-data" 部分为我解决了这个问题。
    【解决方案2】:

    解决此问题的方法是更改​​您为上传控件命名和标识的方式。

    <%: Html.TextBoxFor(model => model.EmpName, new { maxLength = 50 })%>
    
    Upload your files here: 
    <input type="file" id="FileUploadPackets[0].UpFile" name="FileUploadPackets[0].UpFile" value="ActionHandlerForForm"  />
    <%: Html.TextBoxFor(model => model.FileUploadPackets[0].UserEnteredDesc )%>
    
    <input type="file" id="FileUploadPackets[1].UpFile" name="FileUploadPackets[1].UpFile" value="ActionHandlerForForm"  />
    <%: Html.TextBoxFor(model => model.FileUploadPackets[1].UserEnteredDesc )%>
    

    这对我有用!希望它可以帮助其他人..

    【讨论】:

    • 注意:对于 VS2019/NET48,id 语法发生了变化,而不是 指定
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2018-05-12
    • 2012-08-15
    相关资源
    最近更新 更多