0

私はmvc-3に取り組んでいます。レジスターモデルとレジスタービューを作成しました。

ビューの登録:

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true, "Correct the errors and try again.")
    <div>
        <fieldset>
            <legend>Account Information</legend>
            <div class="editor-label">
                @Html.LabelFor(m => m.UserName)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.UserName)
                @Html.ValidationMessageFor(m => m.UserName)
            </div>
            <div class="editor-label">
                @Html.LabelFor(m => m.Email)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Email)
                @Html.ValidationMessageFor(m => m.Email)
            </div>
            <div class="editor-label">
                @Html.LabelFor(m => m.Password)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.Password)
                @Html.ValidationMessageFor(m => m.Password)
            </div>
            <div class="editor-label">
                @Html.LabelFor(m => m.ConfirmPassword)
            </div>
            <div class="editor-field">
                @Html.PasswordFor(m => m.ConfirmPassword)
                @Html.ValidationMessageFor(m => m.ConfirmPassword)
            </div>
            <div class="editor-label">
                @Html.LabelFor(m => m.Question)
            </div>
            <div class="editor-field">
                @Html.DropDownListFor(m => m.Question, new SelectList(Model.Questions))   
                @Html.HiddenFor(m => m.Questions)             
            </div> 
            <div class="editor-label">
                @Html.LabelFor(m => m.Answer)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(m => m.Answer)
                @Html.ValidationMessageFor(m => m.Answer)
            </div>
            <p>
                <input type="submit" value="Register" />
            </p>
        </fieldset>
    </div>
}

モデルの登録

public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [RegularExpression(@"^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,4})$", ErrorMessage="Invalid email address")]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [Display(Name = "Security question")]
    public string Question { get; set; }

    [Display(Name = "Security question")]
    public List<string> Questions { get; set; }

    [Display(Name = "Security answer")]
    public string Answer { get; set; }
}

私の問題は、登録フォームをサーバーに送信するときに、質問リストを除くすべてのデータがサーバーに送信されることです。したがって、検証が失敗した場合、例外Model.Questionsはnullになります。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

1

私の例を見ると、それがどのように機能するかがわかります。

@{
    List<string> test = new List<string> { "111", "222", "333" };
}

<div id="test1">
     @Html.HiddenFor(x => test)
</div>

<div id="test2">
    @for (int i = 0; i < test.Count; i++)
    {
        @Html.HiddenFor(x => test[i])
    }
</div>

レンダリングします:

<div id="test1">
    <input id="test" name="test" type="hidden" value="System.Collections.Generic.List`1[System.String]" />
</div>

<div id="test2">
    <input id="test_0_" name="test[0]" type="hidden" value="111" />
    <input id="test_1_" name="test[1]" type="hidden" value="222" />
    <input id="test_2_" name="test[2]" type="hidden" value="333" />
</div>
于 2012-12-14T08:04:26.607 に答える
1

リストを非表示のフォーム フィールドにシリアライズするか、リストをリロードする前に必ずリストをリロードする必要があります。return View(model);

于 2012-12-14T07:46:32.740 に答える
0

これを試して

public ActionResult SomeAction(RegisterModel model)
{
  if(ModelState.IsValid)
  {
    // perform the functionality when Mmodel is Valid

     return View(model);
  }

  // bind data to Question list if model is fail 
  model.Questions  = new List<String>(); 
  return View(model);
}

注:ビューを返す前にモデルの検証が失敗した場合 は、データを質問リストにバインドする必要があります。

于 2012-12-14T07:53:32.477 に答える