我有一个Controller方法,需要接受客户端发送的多部分/表单数据作为POST请求.表单数据有2个部分.一个是序列化为application / json的对象,另一个是作为application / octet-stream发送的照片文件.我的控制器上有一个方法,如下所示:
[AcceptVerbs(HttpVerbs.Post)] void ActionResult Photos(PostItem post) { }
我可以在这里通过Request.File获取文件没有问题.但是PostItem为null.
不知道为什么?有任何想法吗
控制器代码:
/// <summary> /// FeedsController /// </summary> public class FeedsController : FeedsBaseController { [AcceptVerbs(HttpVerbs.Post)] public ActionResult Photos(FeedItem FeedItem) { //Here the FeedItem is always null. However Request.Files[0] gives me the file I need var processor = new ActivityFeedsProcessor(); processor.ProcessFeed(FeedItem,Request.Files[0]); SetResponseCode(System.Net.HttpStatusCode.OK); return new EmptyResult(); }
}
电线上的客户端请求如下所示:
{User Agent stuff} Content-Type: multipart/form-data; boundary=8cdb3c15d07d36a --8cdb3c15d07d36a Content-Disposition: form-data; name="FeedItem" Content-Type: text/xml {"UserId":1234567,"GroupId":123456,"PostType":"photos","PublishTo":"store","CreatedTime":"2011-03-19 03:22:39Z"} --8cdb3c15d07d36a Content-Disposition: file; filename="testFile.txt" ContentType: application/octet-stream {bytes here. Removed for brevity} --8cdb3c15d07d36a--
解决方法
FeedItem类是什么样的?对于我在帖子信息中看到的内容,它应该类似于:
public class FeedItem { public int UserId { get; set; } public int GroupId { get; set; } public string PublishTo { get; set; } public string PostType { get; set; } public DateTime CreatedTime { get; set; } }
否则它将不受约束.您可以尝试更改操作签名,看看是否有效:
[HttpPost] //AcceptVerbs(HttpVerbs.Post) is a thing of "the olden days" public ActionResult Photos(int UserId,int GroupId,string PublishTo string PostType,DateTime CreatedTime) { // do some work here }
您甚至可以尝试在操作中添加HttpPostedFileBase参数:
[HttpPost] public ActionResult Photos(int UserId,DateTime CreatedTime,HttpPostedFileBase file) { // the last param eliminates the need for Request.Files[0] var processor = new ActivityFeedsProcessor(); processor.ProcessFeed(FeedItem,file); }
如果你真的感觉疯狂和顽皮,请将HttpPostedFileBase添加到FeedItem:
public class FeedItem { public int UserId { get; set; } public int GroupId { get; set; } public string PublishTo { get; set; } public string PostType { get; set; } public DateTime CreatedTime { get; set; } public HttpPostedFileBase File { get; set; } }
最后一段代码片段可能就是您想要的结果,但逐步细分可能对您有所帮助.
这个答案也可以帮助你朝着正确的方向前进:ASP.NET MVC passing Model *together* with files back to controller