Форма не отправляется, и с помощью MVC не создается ошибка

StackOverflow https://stackoverflow.com/questions/1477250

  •  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">&nbsp;</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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top