1

MVCアプリケーションに、理論的にはリポジトリクラスを使用してデータベースにデータを送信するフォームがあります。

ただし、フォームを送信すると(http:// localhost:1028 / Admin / NewUser /)、URLがフォームの送信先に変更されます。これで問題ありません(http:// localhost:1028 / Admin / NewUser /送信)。ただし、送信後、ユーザーを確認ページに送信する必要があります。

私の知る限り、送信になるまですべてのページを正しく移動しています。送信すると、フォームが再び表示されますが、/ 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にかなり慣れていないので、上記が正しいかどうかは完全にはわかりません。

そして、私のデータリポジトリクラスUserRepository.vbで、私が使用している2つの関数は次のとおりです。

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>

コードはエラーを生成しませんが、データベースに送信されていないようです。ですから、どこが間違っているのか完全にはわかりません。

経験豊富な人には明らかかもしれませんが、私はこれについての手がかりを実際に持っていません。

これが問題またはその他の障害の原因となっている私のコードですか?

助けてくれてありがとう。


編集: Zhaph-Ben Duguidのコメントに基づいて、私は次の編集を行いました:

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

NewUser.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() %>

これで、値''のエラーが生成されますが無効です。私のため。

これは、フォームの値がコントローラーに正しく渡されていないことを意味しますか?


編集: Zhaph-Ben Duguidの編集に応じてこれらの編集を行い、Form要素をDBフィールド名に変更しました(少なくともテスト用)。そして今、ページが送信されると、名前、ログイン、および電子メールがすべて入力され、パスワードは空白になります(パスワードボックスに従って予想される動作と想定しています)が、「値''は無効です」というエラーが表示されます。

4

1 に答える 1

3

Response.Writeコントローラでは、ビューに対して何もしません。

モデルを編集ページに戻す必要があります。エラーが発生した場合は、

ModelState.AddModelError();

Professional ASP.NET MVCブックのNerdDinnerの章に、リポジトリパターンを実装し、ASP.NETMVCモデルのバインド機能などを利用する方法の非常に良い例があります。

私が持っているコントローラーの例(c#では恐れています)は、NerdDinnerのサンプルに基づいています:

//
// 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。モデル自体から名前/IDを取得して、フィールドを生成するようなメソッドを使用していることに気付くでしょう。このように、ModelStateにModelErrorsを含むビューをロードすると、ヘルパーはレンダリングされた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」や「Email」などがあります)

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
于 2009-09-25T13:26:56.587 に答える