ASP.NET MVC. How to create Action method that accepts and multipart/form-data

限于喜欢 提交于 2019-12-05 02:13:42
Sergi Papaseit

What does the FeedItem class look like? For what I see in the post info it should look something like:

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; }
}

Otherwise it will not be bound. You could try and change the action signature and see if this works:

[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
}

You could even try and add a HttpPostedFileBase parameter to your action:

[HttpPost]
public ActionResult Photos(int UserId, int GroupId, string PublishTo
    string PostType, DateTime CreatedTime, HttpPostedFileBase file)
{
    // the last param eliminates the need for Request.Files[0]
    var processor = new ActivityFeedsProcessor();
    processor.ProcessFeed(feedItem, file);

}

And if you're really feeling wild and naughty, add HttpPostedFileBase to 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; }
}

This last code snippet is probably what you want to end up with, but the step-by-step breakdown might help you along.

This answer might help you along in de right direction as well: ASP.NET MVC passing Model *together* with files back to controller

As @Sergi say, add HttpPostedFileBase file parameter to your action and I don't know for MVC3 but for 1 and 2 you have to specify in the form/view that you will post multipart/form-data like this :

<% using (Html.BeginForm(MVC.Investigation.Step1(), FormMethod.Post, new { enctype = "multipart/form-data", id = "step1form" }))

And this is in my controller :

[HttpPost]
    [ValidateAntiForgeryToken]
    [Authorize(Roles = "Admin, Member, Delegate")]
    public virtual ActionResult Step1(InvestigationStep1Model model, HttpPostedFileBase renterAuthorisationFile)
    {
        if (_requesterUser == null) return RedirectToAction(MVC.Session.Logout());

        if (renterAuthorisationFile != null)
        {
            var maxLength = int.Parse(_configHelper.GetValue("maxRenterAuthorisationFileSize"));
            if (renterAuthorisationFile.ContentLength == 0)
            {
                ModelState.AddModelError("RenterAuthorisationFile", Resources.AttachAuthorizationInvalid);
            }
            else if (renterAuthorisationFile.ContentLength > maxLength * 1024 * 1204)
            {
                ModelState.AddModelError("RenterAuthorisationFile", string.Format(Resources.AttachAuthorizationTooBig, maxLength));
            }
        } 
        if(ModelState.IsValid)
        {
            if (renterAuthorisationFile != null && renterAuthorisationFile.ContentLength > 0)
            {
                var folder = _configHelper.GetValue("AuthorizationPath");
                var path = Server.MapPath("~/" + folder);
                model.RenterAuthorisationFile = renterAuthorisationFile.FileName;
                renterAuthorisationFile.SaveAs(Path.Combine(path, renterAuthorisationFile.FileName));
            }
            ...
            return RedirectToAction(MVC.Investigation.Step2());
        }
        return View(model);
    }

Hope it helps!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!