1

ASP MVC 4.0 を使用しており、カスタム検証の基本を理解したいと考えています。この特定のケースでは、モデルはコントローラーまたはビューで厳密に型指定されていないため、別のものが必要です。

私がしたいのは、サービスへのサインアップ時に新しいユーザー名を受け入れ、データベースを調べ、そのユーザー名が使用された場合はメッセージ付きで元のフォームを再提示することです。

これは私の入力フォームです:

@{
    ViewBag.Title = "Index";
}

<h2>New account</h2>

<form action= "@Url.Action("submitNew", "AccountNew")" method="post">
    <table style="width: 100%;">
        <tr>
            <td>Email:</td>
            <td>&nbsp;</td>
            <td><input id="email" name="email" type="text" /></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td>&nbsp;</td>
            <td><input id="password" name="password" type="password" /></td>
        </tr>
        <tr>
            <td>Confirm Password:</td>
            <td>&nbsp;</td>
            <td><input id="passwordConfirm" name="passwordConfirm" type="password" /></td>
        </tr>
        <tr>
            <td></td>
            <td>&nbsp;</td>
            <td><input id="Submit1" type="submit" value="submit" /></td>
        </tr>
    </table>
</form>

送信時のコントローラーメソッドは次のとおりです。

    public ActionResult submitNew()
        {
            SomeService service = (SomeService)Session["SomeService"];

            string username = Request["email"];
            string password = Request["password"];

            bool success = service.guestRegistration(username, password);

            return View();
        }

成功が false の場合は、そのことを示すメッセージをフォームに再表示したいと思います。このエラー フローの基本が欠けています。助けてくださいませんか?前もって感謝します。

4

1 に答える 1

1

ViewBag アイテムを追加できます

bool success = service.guestRegistration(username, password);
if (!success)
{
  ViewBag.Error = "Name taken..."
}
return View();

ただし、ビューモデルを作成する必要があります...

public class ViewModel
{
  public string UserName {get; set;}
  //...other properties
}

...ビューを厳密に入力し、組み込みの html ヘルパーを使用します...

@model ViewModel
//...
@using BeginForm("SubmitNew", "AccountNew", FormMethod.Post)()
{
  //...
  <div>@Html.LabelFor(m => m.Username)</div>
  <div>@Html.TextBoxFor(m => m.Username)</div>
  <div>@Html.ValidationMessageFor(m => m.Username)</div>
}

...そしてコントローラーで ModelState を活用する

[HttpPost]
 public ActionResult SubmitNew(ViewModel viewModel)
 {
     if(ModelState.IsValid)
     {
       SomeService service = (SomeService)Session["SomeService"];
       bool success = service.guestRegistration(viewModel.username, viewModel.password);
       if (success)
       {
          return RedirectToAction("Index");
       }
       ModelState.AddModelError("", "Name taken...")"
       return View(viewModel);
     }
 }

...または、独自のバリデーターを作成して、モデル プロパティを装飾するだけで、コントローラーで成功を確認する必要がなくなります。

于 2013-02-11T20:30:30.553 に答える