Modèle passant ASP.NET MVC * * ensemble avec fichiers à contrôleur
-
28-09-2019 - |
Question
Ok, je l'ai été en cours dans ce domaine depuis plusieurs heures et je ne peux pas trouver la solution.
Je veux obtenir des données de mon utilisateur. Alors d'abord, j'utilise un contrôleur pour créer une vue qui reçoit un modèle:
public ViewResult CreateArticle()
{
Article newArticle = new Article();
ImagesUploadModel dataFromUser = new ImagesUploadModel(newArticle);
return View(dataFromUser);
}
Alors, j'ai la vue:
<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>
et enfin - le contrôleur d'origine, mais cette fois configuré pour accepter les données:
[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;
}
Le reste de ce contrôleur n'a pas d'importance car peu importe ce que je fais, l'attribut count
de Request.Files
(ou Request.Files.Keys
) reste à 0. Je ne peux tout simplement pas trouver un moyen de transmettre les fichiers de la forme (le modèle passe juste fine).
La solution
Vous voudrez peut-être envisager de ne pas afficher les fichiers avec le reste de la form- il y a de bonnes raisons et d'autres moyens vous pouvez obtenir ce que vous voulez.
En outre, consultez cette question et ce conseil en ce qui concerne le téléchargement de fichiers dans MVC.
Autres conseils
Vous pouvez ajouter les fichiers à votre modèle de vue:
public class ImagesUploadModel
{
...
public HttpPostedFileBase File1 { get; set; }
public HttpPostedFileBase File2 { get; set; }
}
Et puis:
[HttpPost]
public ActionResult CreateArticle(ImagesUploadModel dataFromUser)
{
if (ModelState.IsValid)
{
// Use dataFromUser.File1 and dataFromUser.File2 directly here
}
return RedirectToAction("index");
}