【问题标题】:How to validate this scenario in ASP.NET MVC?如何在 ASP.NET MVC 中验证这种情况?
【发布时间】:2010-10-03 00:35:51
【问题描述】:

首先,一点上下文(因为我知道你们都喜欢它!):

我有一个名为 Note 的模型。它有一个名为 Type 的字段,在数据库中,它是一个整数值,用于指定该注释属于哪种类型的对象(1 = 客户,2 = 销售线索等)。第二个名为Source的字段指定此笔记所属的特定对象的ID。

例如,如果我想为客户 #34 添加注释,我会将 Type 设置为 1,将 Source 设置为 34。

为了让事情更易读,我有一个名为 DataObjectType 的枚举,它包含每个可能的 Type 整数值到友好名称的映射。因此,例如,DataObjectType.CustomerType 字段中的值 1 相同。

接下来,我有一个自定义路线:

/Notes/New/{type}/{id}

还有两个控制器动作来处理新笔记的创建:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult New(DataObjectType type, int id) {
    Note note = new Note { Type = type, Source = id };
    return View(note);
}

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Note note) {
    // This is just an example
    note.Persist();
    return View("New", note);
}

首先,我需要确保提供给 {type} 路由值的值对于 DataObjectType 枚举有效。这可以通过路由约束来完成吗?目前,New() 的类型参数将接受任何整数,无论​​它是否存在于 DataObjectType 中。

其次,我需要确保用户尝试添加注释的对象在显示新注释表单之前确实存在于数据库中。我可以在 New() 方法中轻松地做到这一点,但有时用户可能会直接将数据发布到 Create() 而无需访问 New ()。在这种情况下,我还需要验证对象是否存在于 Create() 方法中。在不重复代码的情况下,在这两种方法中执行此操作的最佳方法是什么?

【问题讨论】:

    标签: .net asp.net asp.net-mvc validation forms


    【解决方案1】:

    您是正确的,New 和 Create 操作都需要确保它们具有传递给它们的有效模型。执行此操作的正确位置是在模型活页夹中。如果传递了无效对象(或 Id),模型绑定器应添加模型状态错误。 New 和 Create 可能使用相同的模型绑定器。

    不要将路由约束与用户输入验证混淆。当您不自己指定路由时(即,当您使用 Html.ActionLink 而不是 RouteLink 时),路由约束只是帮助路由系统找到合适的路由。如果您使用命名路由,并且应该使用,则不需要约束来找到合适的路由,因为您已经直接指定了路由。路由约束旨在防止某个路由被选择用于它不适合处理的操作,并且不是验证用户输入的地方。

    您要求的功能是一种用户输入验证,即使有问题的用户输入恰好在 URL 中。如果您要超越这种简单的单一案例,您可能需要考虑使用验证框架,因为这将使其他类型的验证更加简单。 Here is one which looks interesting to me.

    【讨论】:

      【解决方案2】:

      在设置路线时,您可以使用一个参数来指定约束(通过正则表达式完成)。您可以使用它来限制那里的 id,但您必须为这种情况创建一个单独的路由,因为您不希望所有“id”都根据该规则进行过滤。

      或者,您可以在控制器操作开始时粘贴此检查。

      至于确保注释已经存在于数据库中,我看不出有什么办法可以在创建操作的开头进行检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多