2010-03-31 5 views
0

Je tente de créer un formulaire dans lequel un utilisateur peut entrer vos zones de texte de valeurs de formulaire, etc., mais également télécharger un fichier dans le formulaire. Ceci est mon code de vue, on peut voir que le téléchargement du fichier est identifié par l'ID MCF:Chargement de fichier de formulaire avec d'autres entrées TextBox + Création d'un attribut de formulaire personnalisé

<% using (Html.BeginForm("Create", "Problem", FormMethod.Post, new { id = "ProblemForm", enctype = "multipart/form-data" })) 
    {%> 

     <p> 
      <label for="StudentEmail">Student Email (*)</label> 
      <br /> 
      <%= Html.TextBox("StudentEmail", Model.Problem.StudentEmail, new { size = "30", maxlength=26 })%> 
      <%= Html.ValidationMessage("StudentEmail", "*") %> 
     </p> 
     <p> 
      <label for="Type">Communication Type (*)</label> 
      <br /> 
      <%= Html.DropDownList("Type") %> 
      <%= Html.ValidationMessage("Type", "*") %> 
     </p> 
     <p> 
      <label for="ProblemDateTime">Problem Date (*)</label> 
      <br /> 
      <%= Html.TextBox("ProblemDateTime", String.Format("{0:d}", Model.Problem.ProblemDateTime), new { maxlength = 10 })%> 
      <%= Html.ValidationMessage("ProblemDateTime", "*") %> 
     </p> 
     <p> 
      <label for="ProblemCategory">Problem Category (* OR Problem Outline)</label> 
      <br /> 
      <%= Html.DropDownList("ProblemCategory", null, "Please Select...")%> 
      <%= Html.ValidationMessage("ProblemCategory", "*")%> 
     </p> 
     <p> 
      <label for="ProblemOutline">Problem Outline (* OR Problem Category)</label> 
      <br /> 
      <%= Html.TextArea("ProblemOutline", Model.Problem.ProblemOutline, 6, 75, new { maxlength = 255 })%> 
      <%= Html.ValidationMessage("ProblemOutline", "*") %> 
     </p> 
     <p> 
      <label for="MCF">Mitigating Circumstance Form</label> 
      <br /> 
      <input id="MCF" type="file" /> 
      <%= Html.ValidationMessage("MCF", "*") %> 
     </p> 
     <p> 
      <label for="MCL">Mitigating Circumstance Level</label> 
      <br /> 
      <%= Html.DropDownList("MCL") %> 
      <%= Html.ValidationMessage("MCL", "*") %> 
     </p> 
     <p> 
      <label for="AbsentFrom">Date Absent From</label> 
      <br /> 
      <%= Html.TextBox("AbsentFrom", String.Format("{0:d}", Model.Problem.AbsentFrom), new { maxlength = 10 })%> 
      <%= Html.ValidationMessage("AbsentFrom", "*") %> 
     </p> 
     <p> 
      <label for="AbsentUntil">Date Absent Until</label> 
      <br /> 
      <%= Html.TextBox("AbsentUntil", String.Format("{0:d}", Model.Problem.AbsentUntil), new { maxlength = 10 })%> 
      <%= Html.ValidationMessage("AbsentUntil", "*") %> 
     </p> 
     <p> 
      <label for="AssessmentID">Assessment Extension</label> 
      <br /> 
      <%= Html.DropDownList("AssessmentID") %> 
      <%= Html.ValidationMessage("AssessmentID", "*") %> 

      <%= Html.TextBox("DateUntil", String.Format("{0:d}", Model.AssessmentExtension.DateUntil), new { maxlength = 16 })%> 
      <%= Html.ValidationMessage("DateUntil", "*") %> 
     </p> 
     <p> 
      <label for="Details">Assessment Extension Details</label> 
      <br /> 
      <%= Html.TextArea("Details", Model.AssessmentExtension.Details, 6, 75, new { maxlength = 255 })%> 
      <%= Html.ValidationMessage("Details", "*") %> 
     </p> 
     <p> 
      <label for="RequestedFollowUp">Requested Follow Up</label> 
      <br /> 
      <%= Html.TextBox("RequestedFollowUp", String.Format("{0:d}", Model.Problem.RequestedFollowUp), new { maxlength = 16 })%> 
      <%= Html.ValidationMessage("RequestedFollowUp", "*") %> 
     </p> 
     <p> 
      <label for="StaffEmail">Staff</label> 
      <br /> 
      <%= Html.ListBox("StaffEmail", Model.StaffEmail, new { @class = "multiselect" })%> 
      <%= Html.ValidationMessage("StaffEmail", "*")%> 
     </p> 
     <p> 
      <input class="button" type="submit" value="Create Problem" /> 
     </p> 

Ceci est mon code du contrôleur:

 [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(Problem problem, AssessmentExtension assessmentExtension, Staff staffMember, HttpPostedFileBase file, string[] StaffEmail) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 

       Student student = studentRepository.GetStudent(problem.StudentEmail); 
       Staff currentUserStaffMember = staffRepository.GetStaffWindowsLogon(User.Identity.Name); 

       var fileName = Path.Combine(Request.MapPath("~/App_Data"), Path.GetFileName(file.FileName)); 
       file.SaveAs(@"C:\Temp\" + fileName); 

       if (problem.RequestedFollowUp.HasValue) 
       { 
        String meetingName = student.FirstName + " " + student.LastName + " " + "Mitigating Circumstance Meeting"; 
        OutlookAppointment outlookAppointment = new OutlookAppointment(currentUserStaffMember.Email, meetingName, (DateTime)problem.RequestedFollowUp, (DateTime)problem.RequestedFollowUp.Value.AddMinutes(30)); 
       } 

       problemRepository.Add(problem); 
       problemRepository.Save(); 

       if (assessmentExtension.DateUntil != null) 
       { 
        assessmentExtension.ProblemID = problem.ProblemID; 
        assessmentExtensionRepository.Add(assessmentExtension); 
        assessmentExtensionRepository.Save(); 
       } 

       ProblemPrivacy problemPrivacy = new ProblemPrivacy(); 
       problemPrivacy.ProblemID = problem.ProblemID; 
       problemPrivacy.StaffEmail = currentUserStaffMember.Email; 
       problemPrivacyRepository.Add(problemPrivacy); 

       if (StaffEmail != null) 
       { 
        for (int i = 0; i < StaffEmail.Length; i++) 
        { 
         ProblemPrivacy probPrivacy = new ProblemPrivacy(); 
         probPrivacy.ProblemID = problem.ProblemID; 
         probPrivacy.StaffEmail = StaffEmail[i]; 
         problemPrivacyRepository.Add(probPrivacy); 
        } 
       } 

       problemPrivacyRepository.Save(); 

       return RedirectToAction("Details", "Student", new { id = student.Email }); 

      } 
      catch 
      { 
       ModelState.AddRuleViolations(problem.GetRuleViolations()); 
      } 
     } 

     return View(new ProblemFormViewModel(problem, assessmentExtension, staffMember)); 
    } 

Cette forme fonctionnait correctement avant que je devais changer à l'aide d'un téléchargement de fichier non-AJAX, cela était dû à un problème avec Flash lors de l'activation de l'authentification Windows que j'ai besoin d'utiliser.

Il semble que lorsque je soumets le formulaire, le fichier n'est pas envoyé et je ne sais pas pourquoi. J'ai également échoué à trouver un exemple en ligne où un téléchargement de fichier est utilisé en conjonction avec d'autres types d'entrée.

Une autre requête que j'ai est que pour les opérations de création et de modification, j'ai utilisé une vue partielle pour mes formulaires afin de rendre mon application plus réutilisable. L'action de forme est normalement générée en utilisant simplement:

Html.BeginForm() 

Et cette action en fonction remplit sur l'URL est utilisé modifier ou créer. Toutefois, lorsque vous remplissez des attributs HTML, vous devez fournir une action et une valeur de contrôleur pour transmettre les attributs HTML. Est-il possible de remplir d'une manière ou d'une autre l'action et la valeur du contrôleur en fonction de l'URL pour maintenir la réutilisation du code? En y réfléchissant tout en tapant ceci, je pourrais définir deux valeurs dans les données d'affichage de la demande d'action de contrôleur d'origine, puis remplir simplement la valeur en utilisant les valeurs de données de visualisation.

Toute aide sur ces deux questions serait apprécié, je suis nouveau asp.net mvc :-)

Merci,

Jon

ANSWER

Ok les gars ont travaillé sur le problème et son incroyablement simple je n'avais pas l'attribut de nom de HTML sur le composant de dossier de mon formulaire:

<input id="MCF" name="MCF" type="file" /> 

Maintenant, cela se lie à ma signature de méthode!

Répondre

0

Ok les gars ont travaillé sur la question et son I incroyablement simple ne pas l'attribut name HTML sur le composant de fichier de ma forme:

<input id="MCFile" name="MCFile" type="file" /> 

J'ai changé ma signature de méthode pour correspondre au nom:

public ActionResult Create(Problem problem, AssessmentExtension assessmentExtension, Staff staffMember, HttpPostedFileBase MCFFile, string[] StaffEmail) 

Maintenant, cela se lie à ma signature de méthode!

0

Avec le premier problème, il semble que la signature de votre méthode d'action soit incorrecte. Étant donné que votre fichier fileInput a un ID de MCF, le paramètre HttpPostedFileBase doit avoir le même nom afin que le classeur de modèle sache se lier à ce paramètre de méthode d'action.

E.g.

public ActionResult Create(Problem problem, AssessmentExtension assessmentExtension, Staff staffMember, HttpPostedFileBase mcf, string[] StaffEmail) 

En ce qui concerne la deuxième question ... vous pouvez essayer quelque chose comme ceci:

<form method="post" id="ProblemForm" action="<%= Url.Action(ViewContext.RouteData.Values["action"].ToString()) %>" enctype="multipart/form-data"> 

Le régulateur de courant sera également en RouteData.Values mais si vous êtes après la région, ce sera en RouteData.DataTokens.

HTHS,
Charles

+0

J'ai essayé vos deux suggestions, avec le fichier un j'ai changé le nom et il est toujours mis à null lorsque je soumets le formulaire. En ce qui concerne le second numéro, j'essaie d'utiliser les méthodes d'aide HTML, votre méthode fonctionnerait de manière aussi provocante que vous l'avez suggéré en imprimant le contrôleur/l'action. Cependant, tout en essayant cela, j'ai trouvé la résolution de Html.BeginForm (null, null, FormMethod.Post, nouveau {id = "ProblemForm", enctype = "multipart/form-data"})) en passant null, il semble par défaut le contrôleur et action en fonction de l'URL. –

+0

Bon pour vous entendre réparé le second. En ce qui concerne le premier problème, essayez peut-être de placer un point de débogage dans votre contrôleur et regardez l'objet Controller.Request.Files - y a-t-il un fichier dans la requête? Si oui, quelle est la clé? S'il n'y a pas de fichier, le problème existe avant de cliquer sur le classeur du modèle. Faites le moi savoir. – Charlino

+0

Il n'y a pas de fichier dans Request.Files count = 0. Cela pourrait-il avoir quelque chose à voir avec le ViewModel que j'utilise comme le ProblemForm est construit à partir de quelques objets. J'ai ajouté un attribut HttpPostedFileBase à cette classe, mais je vais poster le code. –

Questions connexes