繁体   English   中英

ASP.NET MVC 3.0 中的状态模式

[英]State Pattern in ASP.NET MVC 3.0

我的申请中有一个注册页面。 它有 3 个状态和 1 个错误状态(如果出现任何错误):

  1. 填写基本信息
  2. 选择套餐
  3. 说谢谢
  4. 错误

现在我想在这里使用状态模式。 首先,我创建了一个可以的控制台应用程序。 现在我想在我的 MVC 应用程序中实现这个逻辑,但我对结构感到困惑。 我的意思是我需要多少视图、模型和控制器以及在哪里放置我的逻辑。

1 个控制器RegistrationController控制器

6个动作方法

  • GET+POST for Index(填写基本信息)
  • 包的 GET+POST
  • 得到谢谢
  • 获取错误

这是让你思考的粗略代码:

public class RegistrationController : Controller
{
    public ActionResult Index()
    {
        RegistrationState model = RegistrationState.Init();
        // just display the "Fill Basic Info" form
        return View(model);
    }

    [HttpPost]
    public ActionResult Index(RegistrationState data)
    {
        // process data and redirect to next step
        this.TempData["RegState"] = data;
        if (!this.ModelState.IsValid || data.State == State.Error)
        {
            // error should handle provided state and empty one as well
            return RedirectToAction("Error");
        }
        return RedirectToAction("Package");
    }

    public ActionResult Package()
    {
        RegistrationState data = this.TempData["RegState"] as RegistrationState;
        if (data == null)
        {
            return RedirectToAction("Error");
        }

        // get packages and display them
        IList<Package> model = this.repository.GetPackages();
        return View(new Tuple.Create(data, model));
    }

    [HttpPost]
    public ActionResult Package(RegistrationState data)
    {
        // process data blah blah blah
    }

    // and so on and so forth
    ....
}

如您所见,您仍然需要编写一些与 MVC 相关的代码来处理状态更改。 在我的示例中,一切都在操作方法中完成。 但也可以使用动作过滤器。 如果您不能想出一个可以为许多不同状态对象提供服务的通用操作过滤器,那么最好只在操作方法中编写代码。

另一种方法

如果您足够了解 Asp.net MVC,您可以更进一步,编写一个状态机 ControllerFactory,它可以在某种意义上与路由一起工作:

{StateObjectType}/{State}

因此,ControllerFactory 将能够将视图数据解析为已知的状态对象类型,并将执行传递给特定的操作。 根据州。 这将使其成为适合 Asp.net MVC 应用程序的特殊状态机。

更重要的问题当然是你是否可以用这种模式创建整个应用程序,或者它的某些部分应该像这样工作。 您当然可以结合这两种方法并为每种方法提供适当的路由。

重要通知

  1. 你应该非常小心你如何定义你的错误状态,因为输入无效的字段数据不应该导致错误状态,而是导致数据验证错误,这些错误实际上显示在具有无效数据的字段旁边的视图中(即无效日期提供为 13 /13/1313)。 您的错误状态应仅用于与用户输入无关的实际对象状态错误。 那会是什么,超出了我的想象。

    正如我在评论中提到的,您应该查看一些 Asp.net MVC 介绍视频,您将看到验证在 Asp.net MVC 中是如何工作的。 也是比较简单的东西。

  2. 这种状态模式不是普通的 Asp.net MVC 开发人员会使用的东西,因为它很可能会使代码复杂化,而不是采用常规方法。 在你决定之前先分析一下。 Asp.net MVC 是非常干净的代码,因此在它上面添加额外的抽象可能会变得混乱。 并且您的域模型(状态类)很可能具有更复杂的代码,如带有数据注释的简单 POCO。

    在您的情况下,数据验证也会更加复杂(当与数据注释一起使用时),因为您的对象应该根据其状态进行验证,状态之间可能不同。 POCO 对象总是经过相同的验证。 这可能意味着我们可能会使用更多的类,但它们更小、更简单且更易于维护。

我认为你在混淆状态。 状态的例子是:

  1. 等待用户注册
  2. 用户注册成功
  3. 用户未注册成功

现在这些状态中的每一个都有一个页面:

  1. 本地主机:8034/注册
  2. 本地主机:8034/注册/成功
  3. 本地主机:8034/注册/失败

如果用户因为将某些字段留空而无法注册,则他们将处于第一种状态,您将不得不显示一些验证消息。

因此,作为最低限度,我将拥有一个名为 Register 的控制器和以下操作方法:

  1. 索引()获取/发布
  2. 成功() GET
  3. 失败() GET

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM