2010-03-31 2 views
0

Я пытаюсь создать форму, в которой пользователь может ввести ваши типичные текстовые поля значений формы и т. Д., А также загрузить файл как часть представления формы. Это мой взгляд код можно увидеть, что загрузка файла идентифицируется MCF ID:Загрузка файла формы с помощью других входов TextBox + Создание атрибута действия произвольной формы

<% 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> 

Это мой код контроллера:

 [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)); 
    } 

Эта форма работает правильно, прежде чем я должен был переключиться для использования загрузки файлов, отличных от AJAX, это произошло из-за проблемы с Flash при включении Windows Authentication, которые мне нужно использовать.

Похоже, что когда я отправляю форму, файл не отправляется, и я не уверен, почему? Мне также не удалось найти пример онлайн, где загрузка файла используется в сочетании с другими типами ввода.

Другой запрос, который у меня есть, заключается в том, что для операций «Создать» и «Правка» я использовал PartialView для своих форм, чтобы мое приложение имело более высокое повторное использование кода. Форма действия обычно генерируется только с помощью:

Html.BeginForm() 

И это заполнит действие в зависимости от которой Url используется Редактировать или Создать. Однако при заполнении атрибутов HTML вам необходимо предоставить значение action и controller для передачи HTML-атрибутов.

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

Возможно ли каким-либо образом заполнить значение действия и контроллера в зависимости от URL-адреса для повторного использования кода? Размышляя об этом, набрав это, я мог бы установить два значения в исходном представлении запроса действия контроллера, а затем просто заполнить значение, используя значения viewdata?

Любая помощь по этим двум вопросам будут оценены, я новичок в ASP.NET MVC :-)

Спасибо,

Jon

ОТВЕТ

Ok ребята разработали проблема и ее невероятно простой. У меня не было атрибута имени HTML в файловой составляющей моей формы:

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

Теперь это привязывается к моей сигнатуре метода!

ответ

0

Ok ребята разработали этот вопрос и его невероятно просто у меня не было имя атрибута HTML на файл компонента моей формы:

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

Я изменил моя подпись метода в соответствии с названием:

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

Теперь это связывается с моей подписью метода!

0

С первой проблемой, похоже, ваша подпись метода действия неверна. Поскольку ваш fileInput имеет идентификатор MCF, параметр HttpPostedFileBase должен иметь то же имя, чтобы связка модели знала, что она привязана к этому параметру метода действия.

E.g.

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

Что касается второго вопроса ... вы могли бы попробовать что-то вроде этого:

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

Регулятор тока также будет RouteData.Values, но если вы после этой области, что будет в RouteData.DataTokens.

HTHS,
Чарльз

+0

Я пробовал оба ваших предложения, с файлом один я изменил имя, и он по-прежнему установлен в null, когда я отправляю форму. Что касается второй проблемы, я пытаюсь использовать методы хелпера HTML, ваш метод будет наиболее вызывающе работать так, как вы предложили, когда я увидел, что он распечатал контроллер/действие. Однако при этом я нашел разрешение Html.BeginForm (null, null, FormMethod.Post, new {id = "ProblemForm", enctype = "multipart/form-data"})), передав нуль, кажется, по умолчанию контроллер и действия согласно URL. –

+0

Приятно слышать, что вы исправили второй. Что касается первой проблемы, возможно, попробуйте поставить точку прерывания отладки в свой контроллер и взглянуть на объект Controller.Request.Files - есть ли файл в запросе? Если да, то что это за ключ? Если файл отсутствует, проблема возникает, прежде чем ударить с помощью связующего. Дай мне знать. – Charlino

+0

В Request.Files count = 0 нет файла. Так что это может иметь какое-то отношение к ViewModel, который я использую, поскольку ProblemForm построен из нескольких объектов. Я добавил атрибут HttpPostedFileBase для этого класса, но я отправлю код. –

 Смежные вопросы

  • Нет связанных вопросов^_^