【问题标题】:ASP.NET MVC validation for column that's not in databaseASP.NET MVC 验证不在数据库中的列
【发布时间】:2011-08-21 06:25:38
【问题描述】:

所以我的数据库中有下表:

Account [Id (PK, int), Name(string), Password(string)]

我使用 ADO.NET 实体数据模型 (.edmx) 和 ADO.NET 自跟踪实体生成器来自动生成我的模型。

我想为用户创建一个帐户/创建页面,以便在我的网站上创建一个新帐户。显然,我希望同时拥有一个密码字段和一个确认密码字段来验证用户输入。我有以下验证模型来解决这个问题:

namespace MD5DatabaseTest.Models
{
    [MetadataType(typeof(AccountMetaData))]
    public partial class Account {}
    public class AccountMetaData
    {
        public int Id { get; set; }

        [Required(ErrorMessage = "Please type a username")]
        public String Name{ get; set; }

        [Required(ErrorMessage = "Please type a password")]
        public String Password { get; set; }   

        [Required(ErrorMessage = "Please confirm your password")]
        [Compare("Password", ErrorMessage = "Passwords do not match")]
        public String ConfirmPassword{ get; set; }
    }
}

由于我的数据库没有 ConfirmPassword 列,我的 Create.cshtml 代码显然在这里失败:

<div class="editor-label">
            Confirm your password
        </div>
        <div class="editor-field">
            @Html.Password("ConfirmPassword")
            @Html.ValidationMessageFor(model => model.ConfirmPassword)
        </div>

可以使用 MVC 3 数据注释来验证这一点吗?还是我必须为(客户端)验证编写一个单独的 Jscript 函数?

【问题讨论】:

  • 您知道您的比较属性中有错字。 “帕斯伍德”
  • 已修复。这是因为我已经将我的代码从荷兰语翻译成英语,以便这里的人们更好地理解它。

标签: asp.net-mvc asp.net-mvc-3 validation


【解决方案1】:

As Model != ViewModel,即使你想用 as Model,你也可以试试;

[NotMapped]

“ConfirmPassword”属性的属性。在您看来,您可以手动放置 ConfirmPassword 块。不漂亮,但它会按您的预期工作。

【讨论】:

    【解决方案2】:

    模型!= ViewModel。

    您不应直接在视图中使用模型对象。创建一个特定于您的帐户创建页面的 ViewModel(一个具有 ConfirmPassword 属性的,就像您在问题中所拥有的那样)并在 Create 控制器函数中将 ViewModel 中的值复制到您的域模型(它没有ConfirmPassword 属性)并保存。

    由于我的数据库没有 ConfirmPassword 列,我的 Create.cshtml 代码显然失败了

    代码没有理由失败。

    如果您的 ViewModel 上有验证属性,它们将受到尊重,它们不必与数据库中的字段链接。

    实际上,MVC 就是关注点分离。视图不需要知道任何关于数据库的信息,只需要知道模型。模型反过来也知道数据库,但这并不意味着它必须与该数据库进行一对一的映射。

    我希望我的解释有点清楚。如果没有,请告诉我,我会尝试详细说明。

    【讨论】:

    • 太好了。谢谢,我不知道,因为我对 MVC 还很陌生。这确实有效^^
    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多