Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# mvcapi中的控制器输入验证_C#_Asp.net Mvc_Fluentvalidation - Fatal编程技术网

C# mvcapi中的控制器输入验证

C# mvcapi中的控制器输入验证,c#,asp.net-mvc,fluentvalidation,C#,Asp.net Mvc,Fluentvalidation,我已经构建了一个api,需要验证作为参数传递给控制器操作的输入对象。 有时,同一输入类对于不同的操作具有不同的强制属性 所以 我已经看过fluentValidation.net,但似乎每个类都必须创建规则,而不是类/操作 谢谢。什么是用户 我的意思不是说类定义在哪里,而是说它在域中的物理意义是什么?听起来你想让它有多重含义 与其尝试将这些操作放入域的模型中,不如为它们创建操作模型。大概是这样的: class CreateUserAction { public string Username

我已经构建了一个api,需要验证作为参数传递给控制器操作的输入对象。 有时,同一输入类对于不同的操作具有不同的强制属性

所以

我已经看过fluentValidation.net,但似乎每个类都必须创建规则,而不是类/操作


谢谢。

什么是
用户

我的意思不是说类定义在哪里,而是说它在域中的物理意义是什么?听起来你想让它有多重含义

与其尝试将这些操作放入域的模型中,不如为它们创建操作模型。大概是这样的:

class CreateUserAction
{
  public string Username {get; set;}
}

class DeleteUserAction
{
  public int ID {get; set;}
}
然后在行动方法中使用这些方法:

public ActionResult Create(CreateUserAction user)
{
}

public ActionResult Delete(DeleteUserAction user)
{
}
这将根据单一责任原则,将不同的目的划分为不同的类别。现在,
User
类可以专注于简单地表示用户对象,而不是有时表示尚未创建的用户或有时仅表示用户对象的ID等

这里的一个主要好处是,您可以直接在类中指定验证规则。使用这种方法,
用户
对象总是需要
用户名
ID
才有效。而
CreateUserAction
对象甚至没有
ID
(因为它不需要),而
DeleteUserAction
对象没有
Username
(因为它不需要)

您可以根据需要进一步添加其他字段。例如,
CreateUserAction
对象可能会有其他字段来描述正在创建的用户。(它甚至可能有一些字段根本不在
用户
对象上,但会被转换为域中的其他对象。)然而,
删除用户操作
可能只需要一个
ID
(正如SLaks所建议的,对于该动作方法,可能只需要一个
int
,但这取决于您)


类的角色和职责更清晰,部分初始化的半对象更少。

为什么不让
Delete
只获取一个ID?您可以为控制器使用不同的视图模型,其中只包含完成操作所需的属性。谢谢。我已经完成了这些工作。除了using继承和我放置所有fluent规则的空子类公共类用户{public string name{get;set;}}}公共类myUser:User{}公共类myUser Validator:AbstractValidator{//rules}在如何序列化到基类型方面没有问题。
public ActionResult Create(CreateUserAction user)
{
}

public ActionResult Delete(DeleteUserAction user)
{
}