mvc api中的控制器输入验证

时间:2012-01-30 17:34:32

标签: c# asp.net-mvc fluentvalidation

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

所以

public class test
{
public ActionResult Create(User user)
{
  //here user_name must be present but no user_id
}
public ActionResult Delete(User user)
{
  //here only user_id must be present.
}
}

我已经看过fluentValidation.net但似乎必须在每个类的基础上创建规则而不是类/动作。

感谢。

1 个答案:

答案 0 :(得分:2)

什么是User

我并不是指在类定义的位置意义上,而是从它在域中的实际意义上来说意味着什么?听起来你正试图让它意味着多件事。

不要试图将这些操作放入域的模型中,而是为它们创建动作模型。像这样:

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用户对象等

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

您可以根据需要进一步添加其他字段。例如,CreateUserAction对象可能有其他字段来描述正在创建的用户。 (它甚至可能包含根本不在User对象上的字段,但会被转换为域中的其他对象。)但是,DeleteUserAction可能永远不需要ID(并且,正如SLaks所建议的那样,对于该操作方法,可能只能替换为int,但这取决于您)。

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