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是空的。我该如何解决这个问题?

4

3 回答 3

1

您需要将列表序列化为隐藏的表单字段,或者确保在您之前重新加载列表return View(model);

于 2012-12-14T07:46:32.740 回答
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 回答
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 回答