Your file is not being posted because you do not have the necessary enctype
attribute on the form. Change the view to use
@using (Html.BeginForm("Create", "Testimonials", FormMethod.Post, new { enctype = "multipart/form-data" }))
You will now get the file and save it, but there is no relationship to your Testimonials
object so you cannot retrieve it. You will need to add additional fields in your Testimonials
table to store the file properties (or a separate table if a Testimonials
can have multiple images). I also recommend you save the file to your server with a unique identifier (e.g. a Guid
to prevent accidental overwriting if 2 users upload files with the same name). You revised model might be
public class Testimonials
{
public int Id { get; set; }
public string Testimonial { get; set; }
public string ImagePath { get; set; }
public string ImageDisplayName { get; set; }
}
I would also recommend using a view model for the view that includes the above properties plus public HttpPostedFileBase Image { get; set; }
so that you can strongly bind to the model and add validation attributes (for example a [FileSize]
attribute assuming you do not want to allow users to upload 2GB files). Your controller method would then be
[HttpPost]
public ActionResult Create(TestimonialVM model)
{
// ModelState.IsValid check omitted
Testimonials testimonials = new Testimonials();
// map view model properties to the data model
....
if (model.Image != null && model.Image.ContentLength > 0)
{
string displayName = model.Image.FileName;
string fileExtension = Path.GetExtension(displayName);
string fileName = string.Format("{0}.{1}", Guid.NewGuid(), fileExtension)
string path = Path.Combine(Server.MapPath("~/Images/"), fileName)
model.Image.SaveAs(path);
// Update data model
testimonials.ImagePath = path;
testimonials.ImageDisplayName = displayName;
}
TestimonialsContext testContext = new TestimonialsContext();
testContext.testimonialContext.Add(testimonials);
testContext.SaveChanges();
return RedirectToAction("Index");
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…