在MVC2中,如何验证不在我的数据模型中的字段?

时间:2010-05-22 03:45:30

标签: asp.net-mvc-2

我在VS 2010中玩MVC2,我真的很喜欢它。在我从头开始的沙箱应用程序中,我的数据库在ADO.NET实体数据模型中表示,并使用Scott Guthrie的“伙伴类”方法对我的数据模型中的字段进行了大量验证,该方法运行良好

但是,在我设计并正在尝试的用户注册表单中,我想添加“确认电子邮件地址”或“确认密码”字段。由于这些字段显然不存在于我的数据模型中,我如何验证客户端和服务器端的这些字段?

我想实现类似'Html.ValidationMessageFor'的东西,但这些字段在数据模型中不存在。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

我使用视图模型。在视图模型有效之前,我不会创建要保留的数据模型实例。 下面是一个简单的例子。请注意,某些属性是数据模型,但验证属性仅存在于此视图模型上。(此处的基础不相关)

public class ProblemAddToDepartmentProductView : ViewModel
{
    public Problem Problem { get; set; }
    public IList<Product> AllProducts { get; set; }
    public IList<Department> AllDepartments { get; set; }
    public string ProblemId { get; set; }
    public string ProblemName { get; set; }

    [DisplayName("Choose the product:")]
    [Required(ErrorMessage = "Select the Product.")]
    public string SelectedProduct { get; set; }

    public SelectList GetProducts()
    {
        var selectList = new SelectList(AllProducts, "Id", "Name");
        return selectList;
    }
    [DisplayName("Choose the department using this problem for that product:")]
    [Required(ErrorMessage = "Select the Department.")]
    public string SelectedDepartment { get; set; }


    public SelectList GetDepartments()
    {
        var selectList = new SelectList(AllDepartments, "Id", "Name");
        return selectList;
    }

    internal class ProductSelect
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }

}

它也有助于在页面上看到它:

    <fieldset>
        <legend>Fields</legend>
        <div class="editor-label">
            <%= Html.LabelFor(x => x.SelectedProduct) %>
        </div>
        <div class="editor-field">
            <%= Html.DropDownListFor(x => x.SelectedProduct, Model.GetProducts(),"--Select One--") %>
            <%= Html.ValidationMessageFor(x => x.SelectedProduct)%>
        </div>
        <div class="editor-label">
            <%= Html.LabelFor(x => x.SelectedDepartment) %>
        </div>
        <div class="editor-field">
            <%= Html.DropDownListFor(x => x.SelectedDepartment, Model.GetDepartments(),"--Select One--") %>
            <%= Html.ValidationMessageFor(x => x.SelectedDepartment)%>
        </div>

        <p>
            <input type="submit" value="Add Selected" />
        </p>
    </fieldset>

我也是这样做的,因此如果验证失败,模型将具有这些值,以便为下拉列表提取所需的数据:

 p.ProblemId)%&gt;

&lt;%= Html.HiddenFor(p =&gt; p.ProblemName)%&gt;

答案 1 :(得分:1)

<强>客户端:

  • 使用Javascript验证

并/或

服务器端:

  • 在Controller中验证(使用FormCollection) -
  • 创建“CustomViewModel”类,其中包含所有验证,强烈输入您的视图 -

您可以为Model添加两个字符串属性。这样做可以让您在Controller中填充模型的实例,并在Model / s中进行相应的验证......