与ASP.NET MVC 3中的视图页面不同的模型的表单

Wes*_*sey 28 razor asp.net-mvc-3

我有包含注册表单的结果页面.我正在尝试在电子邮件模型上使用客户端验证,但我不能,因为模型类型与我发布的类型不同.

class Results
{
     ... // some results data to display
}

class EmailSignup
{
    public virtual int Id { get; set; }

    [Required(ErrorMessage = "Please enter your email.")]
    [DataType(DataType.EmailAddress)]
    [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Please enter a valid email address.")]
    public virtual string Email { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Results.cshtml

@model MyApp.Results
[display results]
...
@using (Html.BeginForm("SubmitEmail", "AnalysisResults", FormMethod.Post))
{
     <fieldset>
     @Html.TextBoxFor( model => model.???? )
     </fieldset>
}
Run Code Online (Sandbox Code Playgroud)

我希望用户提交的类型是EmailSignup,而不是结果.

SLa*_*aks 31

将表单移动到采用EmailSignup模型的局部视图.

  • 这有效,但这是一个烦人的解决方案,因为它不必要地强迫您使用局部视图.我认为微软应该更新`BeginForm`以选择性地采用不同的模型. (5认同)

Dan*_*iel 6

这可以很容易地完成.你必须这样做:

var contactModel = new ContactModel();
@Html.TextBoxFor(m => contactModel.Title)
@Html.ValidationMessageFor(m => contactModel.Title)
Run Code Online (Sandbox Code Playgroud)

验证就像一个魅力.

  • 生成的文本框名称将为“contactModel.Title”,而不是“Title” (2认同)