Форма не отправляется, и с помощью MVC не создается ошибка
-
16-09-2019 - |
Вопрос
У меня есть форма в моем приложении MVC, которая теоретически должна отправлять данные обратно в мою базу данных, используя класс репозитория.
Однако, когда я отправляю форму (http://localhost:1028/Admin/NewUser/), URL-адрес меняется на то, куда должна быть отправлена форма, и это нормально (http://localhost:1028/Admin/NewUser/Submit), но как только оно будет отправлено, оно должно отправить пользователя на страницу подтверждения.
Насколько я могу судить, я правильно просматриваю все свои страницы, пока дело не доходит до отправки, где форма снова отображается, но под /Администратор/Новый пользователь/Отправить и эти данные не вставляются в базу данных.
Это ActionResult, который я использую:
Public Function Submit() As ActionResult
Try
Dim user = New hdUser() With { _
.userLogon = Request.Form("UserLogin"), _
.userPass = Request.Form("UserPassword"), _
.userEmail = Request.Form("UserEmail"), _
.RealName = Request.Form("UserFullName"), _
.isLive = 1, _
.avatar = "noavatar.gif" _
}
userRepository.Add(user)
userRepository.Save()
Return Redirect("/Admin/NewUser/Confirm")
Catch ex As Exception
ModelState.AddModelError("Error", ex)
End Try
Return View()
End Function
Я довольно новичок в MVC, поэтому я не совсем уверен, правильно ли вышесказанное или нет.
И в моем классе хранилища данных Пользовательское хранилище.vb, две функции, которые я использую, следующие:
Public Sub Add(ByVal user As hdUser) Implements IUserRepository.Add
db.hdUsers.InsertOnSubmit(user)
End Sub
и
Public Sub Save() Implements IUserRepository.Save
db.SubmitChanges()
End Sub
И форма, которую я создал, это:
<form action="/Admin/NewUser/Submit" method="post">
<table border="0" cellpadding="0" cellspacing="2">
<tr>
<td><strong>User's Full Name</strong> <br />
<%=Html.TextBox("UserFullName")%>
</td>
</tr>
<tr>
<td><strong>User Login</strong> <br />
<%=Html.TextBox("UserLogin")%>
</td>
</tr>
<tr>
<td><strong>Password</strong> <br />
<%=Html.Password("UserPassword")%>
</td>
</tr>
<tr>
<td><strong>Email Address</strong> <br />
<%=Html.TextBox("UserEmail")%>
</td>
</tr>
<tr>
<td align="right"><input type="submit" value="Create" /></td>
</tr>
</table>
</form>
Код не выдает никаких ошибок, но также, похоже, не отправляется в базу данных.Так что я не совсем уверен, где я ошибся.
Это могло бы быть очевидно для кого-то более опытного, но я действительно не имею ни малейшего представления об этом.
Это мой код вызывает проблему или какая-то другая ошибка?
Заранее спасибо за любую помощь.
Редактировать: Основываясь на комментарии Жафа - Бена Дугида, я внес следующие правки:
AdminController.vb
<AcceptVerbs(HttpVerbs.Post)> _
Public Function NewUser(ByVal formValues As FormCollection) As ActionResult
Try
Dim user = New hdUser()
user.userLogon = Request.Form("UserLogin")
user.userPass = Request.Form("UserPassword")
user.userEmail = Request.Form("UserEmail")
user.RealName = Request.Form("UserFullName")
user.isLive = 1
user.avatar = "noavatar.gif"
UpdateModel(user)
userRepository.Add(user)
userRepository.Save()
Catch ex As Exception
ModelState.AddModelError("Error", ex)
End Try
Return View()
End Function
Новый пользователь.aspx
<%Html.BeginForm()%>
<%=Html.ValidationMessage("Error")%>
<table border="0" cellpadding="0" cellspacing="2">
<tr>
<td><strong>User's Full Name</strong> <br />
<%=Html.TextBox("UserFullName")%>
<%=Html.ValidationMessage("Name", "*")%></td>
</tr>
<tr>
<td><strong>User Login</strong> <br />
<%=Html.TextBox("UserLogin")%>
<%=Html.ValidationMessage("Username", "*")%></td>
</tr>
<tr>
<td><strong>Password</strong> <br />
<%=Html.Password("UserPassword")%>
<%=Html.ValidationMessage("Password", "*")%></td>
</tr>
<tr>
<td><strong>Email Address</strong> <br />
<%=Html.TextBox("UserEmail")%>
<%=Html.ValidationMessage("Email", "*")%></td>
</tr>
<tr>
<td align="right"><input type="submit" value="Create" /></td>
</tr>
</table>
<% Html.EndForm() %>
Который теперь выдает ошибку Значение " недопустимо. для меня.
Означает ли это, что значения формы неправильно передаются контроллеру?
Редактировать: Я внес эти правки в ответ на правку Жафа - Бена Дугида и изменил элементы формы на имена полей базы данных (по крайней мере, для тестирования).И теперь, когда на странице отправлено имя, логин и адрес электронной почты заполнены, пароль пуст (что, я предполагаю, является ожидаемым поведением в соответствии с полями пароля), но я все равно получаю "Значение " недопустимо" ошибка.
Решение
Response.Write
в вашем контроллере это ничего не изменит с представлением.
Вы должны вернуть свою модель обратно на страницу редактирования с любыми ошибками в
ModelState.AddModelError();
Есть очень хороший пример того, как вы можете реализовать шаблон репозитория и воспользоваться преимуществами ASP.NET Функций привязки модели MVC и т.д. В Глава " НердДиннер " из профессиональной книги ASP.NET MVC.
Пример контроллера, который у меня есть (боюсь, на c #), основан на примерах Nerd Dinner:
//
// POST: /AdminAlbums/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
var album = new Album();
// Method on System.Web.Mvc.Controller, that takes a form collection, and
// using reflection on the Model, assigns values to it from the form.
UpdateModel(album);
if (album.IsValid)
{
// These methods are the same as yours
m_PhotoRepository.Add(album);
m_PhotoRepository.Save();
// In this instance, I'm returning the user to a list view of Albums
// for editing, probably ought to send them to the page to start
// uploading photos.
return RedirectToAction("Index");
}
// Still here, so I'm going to set up some ViewData I need.
ViewData["Title"] = "Create a new album";
ViewData["Message"] = "Create Album";
// I'm picking up errors from the model here.
// RuleViolation is my own class, implemented in a partial on Album.
foreach (RuleViolation violation in album.GetRuleViolations())
{
ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
}
return View(album);
}
Таким образом, вы можете видеть, что я возвращаю модель обратно в основной вид, если возникает ошибка, чтобы заполнить сводку проверки.
Соответствующей частью представления является:
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm()) {%>
<fieldset>
<legend>Album details</legend>
<div class="form_row">
<label for="Caption" class="left_label">Album caption:</label>
<%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
<%= Html.ValidationMessage("Caption", "*") %>
<div class="cleaner"> </div>
</div>
<div class="form_row">
<label for="IsPublic" class="left_label">Is this album public:</label>
<%= Html.CheckBox("IsPublic", Model.IsPublic) %>
</div>
<div class="form_row">
<input type="submit" value="Save" />
</div>
</fieldset>
<% } %>
Редактировать в ответ на вопрос редактировать
Извините, я должен был уточнить:
Многое из этого основано на использовании вспомогательных методов, предоставляемых платформой ASP.NET MVC - вы заметите, что я использую такие методы, как Html.TextBox
чтобы сгенерировать мои поля с их именем / идентификатором, извлеченным из самой модели.Таким образом, если я загружу представление с ModelErrors в ModelState, помощник добавит соответствующие сведения в отрисованный HTML, чтобы включить следующую разметку
<label for="Caption" class="left_label">Caption:</label>
<input class="input-validation-error textbox"
id="Caption" name="Caption" type="text" value="" />
<span class="field-validation-error">*</span>
Другим вариантом, который у вас мог бы быть, было бы добавить сообщение в ViewData
коллекция, и если у нее есть значение, отобразите его в своем представлении.
Редактировать в ответ на вопрос редактировать
Несколько вещей, которые следует иметь в виду:
1) Идентификаторы элементов формы и элементов управления проверкой должны быть одинаковыми:
<%= Html.TextBox("Caption", Model.Caption, new { @class = "textbox" })%>
<%= Html.ValidationMessage("Caption", "*") %>
(у вас есть такие вещи, как "userEmail" и "Электронная почта")
2) Вы должны возвращать hdUser в режим просмотра при ошибке - так что попробуйте что-то вроде этого:
<AcceptVerbs(HttpVerbs.Post)> _
Public Function NewUser(ByVal formValues As FormCollection) As ActionResult
Dim user = New hdUser()
Try
UpdateModel(user)
user.isLive = 1
user.avatar = "noavatar.gif"
userRepository.Add(user)
userRepository.Save()
Catch ex As Exception
ModelState.AddModelError("Error", ex)
End Try
Return View(user)
End Function