在控制器中编写ModelState验证码作为自己的方法,因此可以通过多个ActionResults调用它

时间:2018-06-13 13:33:43

标签: c#

早上好,

我认为自己比ASP.NET的初学者好一点,但我有一个问题,我需要帮助,我觉得应该相当简单,但不能开始工作。我目前正在建立一个网站,并希望在提交表单时实施一些验证规则。我知道我可以直接为我在其中创建相应的ActionResult方法的每个页面编写验证,但我更愿意将验证代码编写为控制器中自己的方法,并且在控制器中调用每个ActionResult中的方法(例如,我的ActionResult Create,ActionResult Edit,ActionResult Review)。我想这样做是为了让代码更简单易读,特别是因为我写的验证代码大约有500行。

这里只是我使用的代码的一部分:

if (ModelState.IsValidField("Name") && customerDatabase.Name== null)
   {
    ModelState.AddModelError("Name", "The customer's name is required.");
   }

if (ModelState.IsValidField("AccountNumber") && customerDatabase.AccountNumber.Length != 10)
   {
    ModelState.AddModelError("AccountNumber", "The customer's account number must be 10 digits long.");
   }

if (ModelState.IsValidField("Address") && customerDatabase.Address == null)
   {
    ModelState.AddModelError("Address", "The customer's address is required.");
   }

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

考虑对模型上的简单验证使用验证属性

  

在MVC中,验证在客户端和服务器上都会发生。

     

幸运的是,.NET已将验证抽象为验证属性。这些属性包含验证代码,从而减少了必须编写的代码量。

例如

public class CustomerDatabase {

    [Required]
    public string Name { get; set; }

    [StringLength(10)]
    public string AccountNumber { get; set; }

    [Required]
    public string Address { get; set; }

    //...other properties

}

这也允许在MVC视图中进行客户端验证

它将减少服务器上所需的重复验证量

if(ModelState.IsValid) {

    //...

}

return View(customerDatabase);

另一种方法是创建自定义操作过滤器以应用验证检查

public class ValidateCustomerModelAttribute : ActionFilterAttribute {
    public override void OnActionExecuting(ActionExecutingContext context) {
        var ModelState = context.Controller.ViewData.ModelState;
        var customerDatabase = (MyModel)ModelState.Value; //cast to expected model type
        if (ModelState.IsValidField("Name") && customerDatabase.Name== null) {
            ModelState.AddModelError("Name", "The customer's name is required.");
        }

        if (ModelState.IsValidField("AccountNumber") && customerDatabase.AccountNumber.Length != 10) {
            ModelState.AddModelError("AccountNumber", "The customer's account number must be 10 digits long.");
        }

        if (ModelState.IsValidField("Address") && customerDatabase.Address == null) {
            ModelState.AddModelError("Address", "The customer's address is required.");
        }

        //...
    }
}

并将其用于所需的操作

[ValidateCustomerModel]
[HttpPost]
public  ActionResult Create(MyModel customerDatabase) {
    if(ModelState.IsValid) {

        //...

    }

    return View(customerDatabase);
}

参考Model validation in ASP.NET Core MVC