ASP.NET MVC passando Modello * insieme * con i file indietro al controllore
-
28-09-2019 - |
Domanda
Ok, sto andando a questo per diverse ore e ho semplicemente non riesce a trovare la soluzione.
Voglio ottenere alcuni dati dal mio utente. Quindi, prima, io uso un controller per creare una vista che riceve una modella:
public ViewResult CreateArticle()
{
Article newArticle = new Article();
ImagesUploadModel dataFromUser = new ImagesUploadModel(newArticle);
return View(dataFromUser);
}
Poi, ho la vista:
<asp:Content ID="Content1" ContentPlaceHolderID="MainContentPlaceHolder" runat="server">
<h2>AddArticle</h2>
<% using (Html.BeginForm("CreateArticle", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })){ %>
<%= Html.LabelFor(model => model.newArticle.Title)%>
<%= Html.TextBoxFor(model => model.newArticle.Title)%>
<%= Html.LabelFor(model => model.newArticle.ContentText)%>
<%= Html.TextBoxFor(model => model.newArticle.ContentText)%>
<%= Html.LabelFor(model => model.newArticle.CategoryID)%>
<%= Html.TextBoxFor(model => model.newArticle.CategoryID)%>
<p>
Image1: <input type="file" name="file1" id="file1" />
</p>
<p>
Image2: <input type="file" name="file2" id="file2" />
</p>
<div>
<button type="submit" />Create
</div>
<%} %>
</asp:Content>
e infine - il controller originale, ma questa volta configurato per accettare i dati:
[HttpPost]
public ActionResult CreateArticle(ImagesUploadModel dataFromUser)
{
if (ModelState.IsValid)
{
HttpPostedFileBase[] imagesArr;
imagesArr = new HttpPostedFileBase[2];
int i = 0;
foreach (string f in Request.Files)
{
HttpPostedFileBase file = Request.Files[f];
if (file.ContentLength > 0)
imagesArr[i] = file;
}
Il resto di questo controller non importa dal momento che non importa quello che faccio, l'attributo count
di Request.Files
(o Request.Files.Keys
) rimane 0. Ho semplicemente non riesco a trovare un modo per passare i file dal modulo (il Modello passa proprio fine).
Soluzione
Si potrebbe prendere in considerazione non inviare i file con il resto del form- ci sono buone ragioni e altri modi si può ottenere quello che vuoi.
Inoltre, controlla questa domanda e questo consiglio per quanto riguarda il caricamento di file in MVC.
Altri suggerimenti
Si potrebbe aggiungere i file al modello di vista:
public class ImagesUploadModel
{
...
public HttpPostedFileBase File1 { get; set; }
public HttpPostedFileBase File2 { get; set; }
}
E poi:
[HttpPost]
public ActionResult CreateArticle(ImagesUploadModel dataFromUser)
{
if (ModelState.IsValid)
{
// Use dataFromUser.File1 and dataFromUser.File2 directly here
}
return RedirectToAction("index");
}