定义字段验证的最佳位置在哪里?

时间:2010-09-29 06:59:33

标签: c# regex model-view-controller validation

名称字段需要验证为以大写字母开头,不允许带号码。我会用正则表达式做到这一点。实现MVC模式。

我是否应该让控制器发送输入到检查类的值并将相应的错误信息发送回UI,然后检查后调用将其写入数据库的类
OR
我应该让控制器将“值输入”发送到将其写入数据库的类,然后此方法调用验证方法吗?

4 个答案:

答案 0 :(得分:1)

你可以使用这样的东西(我已用于电子邮件验证)

    [Required(ErrorMessageResourceType = typeof(CCSModelResources), ErrorMessageResourceName = "ANTCommonTextRequiredMessage")]
    [RegularExpression(@"^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$",
        ErrorMessageResourceType = typeof(CCSModelResources), ErrorMessageResourceName = "ANTCommonTextRegularExpressionMessage")]
    public new string EmailAddress 
    {
        get { return base.EmailAddress; }
        set { base.EmailAddress = value; } 
    }

你的控制器代码如

    [Authorize]        
    [HttpPost]
    public ActionResult UpdatePersonalDetails(FormCollection form)
    {
        regUserWizard.PersonalDetails = new MVCPersonalDetails();

        if (!TryUpdateModel<MVCPersonalDetails>(regUserWizard.PersonalDetails, form.ToValueProvider()))
        {
            return View("UpdateUser", regUserWizard);
        }
else
        {
            //you code
        }

        return RedirectToAction("Index", "Home");
    }

您查看的代码如

&LT; %= Html.ValidationSummary(“帐户创建失败。请更正错误,然后重试。”)%&gt; &lt;%Html.EnableClientValidation();         使用(Html.BeginForm()){%&gt;        //你编码

答案 1 :(得分:0)

第一种方法似乎更正确,因为db访问逻辑不应与验证混合。

答案 2 :(得分:0)

控制器的目的是验证输入并为模型提供有效输入。您的模型不应关注视图提供的输入。它应该只关注业务逻辑。您可以在客户端添加一些验证代码以便于使用,但出于安全目的,它也需要出现在服务器端。

你的第一种方法是正确的......继续......

答案 3 :(得分:0)

在我看来,这完全取决于你想要执行什么样的验证:
1.如果您不希望某个字段为空,我会在视图图层上进行检查。这是大多数正则表达式可以应用的地方 2.如果我想确保用户输入(例如用户名)是唯一的,我将在控制器端进行验证并将任何反馈传递回视图。在后者中,控制器可能依赖于数据访问层或服务层的抽象来进行实际检查。