2010-06-01 3 views
1

Je crée un formulaire simple pour télécharger un fichier (qui peut être donné un nom convivial).Obtenir 404 sur un contrôleur simple

Je suis allé sur ce code à maintes reprises, mais toujours obtenir un 404 lorsque le formulaire écrit dans/MyEntities/Add (c'est une adresse post-only exprès).

Toutes les pensées seraient très appréciées - Je ne peux tout simplement pas voir ce que j'ai fait de mal.

Le contrôleur:

public class MyEntitiesController : Controller 
{ 
    private DataFilesComparisonRepository repository = new DataFilesComparisonRepository(); 

    public ActionResult Index() 
    { 
     List<MyEntitiesDataset> datasets = repository.GetMyEntitiesDatasets(); 
     return View(datasets); 
    } 

    [HttpPost] 
    public ActionResult Add(HttpPostedFileBase postedFile, string friendlyName) 
    { 
     repository.AddMyEntities(friendlyName, postedFile.FileName, postedFile.InputStream); 
     return RedirectToAction("Index"); 
    } 
     } 

Et la vue:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<List<MyEntitiesDataset>>" %> 
<%@ Import Namespace="DataFilesComparison.Models" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
The Title 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% Html.BeginForm("Add", "MyEntities", FormMethod.Post, new { enctype = "multipart/form-data" }); %> 
<p> 
<input type="file" name="postedFile" /> 
<label for="friendlyName">Friendly Name:</label> 
<%= Html.TextBox("friendlyName") %> 
<input type="submit" value="Add" /> 
</p> 
<% Html.EndForm(); %> 

<% if (Model == null || Model.Count == 0) { %> 
<p>No datasets found.</p> 
<% } else { %> 
<ul> 
<% foreach (MyEntitiesDataset dataset in Model) { %> 
<li> 
<%= dataset.Name %> 
[<%= Html.ActionLink("X", "Delete", new { ID = dataset.ID })%>] 
</li> 
<% } %> 
</ul> 
<% } %> 
</asp:Content> 
+0

Est-ce que/MyEntities/Add existe en tant que fichier? Ou utilisez-vous/Add comme paramètre? Si en tant que paramètre, essayez? Ajouter à la place. – barrycarter

+1

Quelles sont vos routes depuis Global.asax? Avez-vous changé par rapport à la valeur par défaut que cela peut avoir à découvrir je suppose. – Amadiere

Répondre

0

Le modèle que vous passez dans la vue n'est pas le même du même type que vous envoyez des messages de nouveau dans la Ajouter (), qui peut être source de confusion pour les paramètres de routage par défaut. Bien que je vois que vous avez été explicite quant à la méthode à appeler, j'ai déjà eu des problèmes de ce genre. Essayez peut-être de créer un ViewModel avec les propriétés dont vous avez besoin pour GET et POST, puis de les utiliser dans les méthodes View et Controller. Comme ceci:

Modèle

public MyViewModel 
{ 
    public List<MyEntitiesDataset> Datasets {get; set;} 
    public HttpPostedFileBase PostedFile {get; set;} 
    public string FriendlyName {get; set;} 
} 

contrôleur Méthodes

public ActionResult Index() 
{ 
    MyViewModel model = new MyViewModel(); 
    model.Datasets = repository.GetMyEntitiesDatasets(); 
    return View(datasets); 
} 

[HttpPost] 
public ActionResult Add(MyViewModel model) 
{ 
    repository.AddMyEntities(model.FriendlyName, Model.PostedFile.FileName, Model.postedFile.InputStream); 
    return RedirectToAction("Index", model); 
} 

Voir

%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master"  Inherits="System.Web.Mvc.ViewPage<MyViewModel>" %> 
<%@ Import Namespace="DataFilesComparison.Models" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
The Title 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% Html.BeginForm("Add", "MyEntities", FormMethod.Post, new { enctype = "multipart/form-data" }); %> 
<p> 
<input type="file" name="postedFile" /> 
<label for="Model.FriendlyName">Friendly Name:</label> 
<%= Html.TextBoxFor(m => m.FriendlyName) %> 
<input type="submit" value="Add" /> 
</p> 
<% Html.EndForm(); %> 

<% if (Model.Datasets == null || Model.Datasets.Count == 0) { %> 
<p>No datasets found.</p> 
<% } else { %> 
<ul> 
<% foreach (var dataset in Model.Datasets) { %> 
<li> 
<%= dataset.Name %> 
[<%= Html.ActionLink("X", "Delete", new { ID = dataset.ID })%>] 
</li> 
<% } %> 
</ul> 
<% } %> 
</asp:Content> 

Vous mig Il doit jouer avec le téléchargeur de fichier (pas sûr s'il y a un Html.FileFor, mais j'espère que vous avez l'idée!

Bonne chance.

Questions connexes