Я пытаюсь создать форму, в которой пользователь может ввести ваши типичные текстовые поля значений формы и т. Д., А также загрузить файл как часть представления формы. Это мой взгляд код можно увидеть, что загрузка файла идентифицируется 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" />
Теперь это привязывается к моей сигнатуре метода!
Я пробовал оба ваших предложения, с файлом один я изменил имя, и он по-прежнему установлен в null, когда я отправляю форму. Что касается второй проблемы, я пытаюсь использовать методы хелпера HTML, ваш метод будет наиболее вызывающе работать так, как вы предложили, когда я увидел, что он распечатал контроллер/действие. Однако при этом я нашел разрешение Html.BeginForm (null, null, FormMethod.Post, new {id = "ProblemForm", enctype = "multipart/form-data"})), передав нуль, кажется, по умолчанию контроллер и действия согласно URL. –
Приятно слышать, что вы исправили второй. Что касается первой проблемы, возможно, попробуйте поставить точку прерывания отладки в свой контроллер и взглянуть на объект Controller.Request.Files - есть ли файл в запросе? Если да, то что это за ключ? Если файл отсутствует, проблема возникает, прежде чем ударить с помощью связующего. Дай мне знать. – Charlino
В Request.Files count = 0 нет файла. Так что это может иметь какое-то отношение к ViewModel, который я использую, поскольку ProblemForm построен из нескольких объектов. Я добавил атрибут HttpPostedFileBase для этого класса, но я отправлю код. –