C# ASP.NET MVC 3.0中的状态模式

C# ASP.NET MVC 3.0中的状态模式,c#,asp.net-mvc,asp.net-mvc-3,design-patterns,state-pattern,C#,Asp.net Mvc,Asp.net Mvc 3,Design Patterns,State Pattern,我的申请表上有注册页。它有3个状态和1个错误状态(如果出现任何错误): 填写基本信息 选择包 说谢谢 错误 现在我想在这里使用状态模式。首先,我创建了一个控制台应用程序。现在我想在我的MVC应用程序中实现这个逻辑,但是我对它的结构感到困惑。我指的是我需要多少视图、模型和控制器,以及在哪里放置逻辑。1个控制器:注册控制器 6种行动方法: 获取+发布索引(填写基本信息) 获取+邮寄包裹 去拿吧,谢谢 找错 这是一个粗略的代码,可以让你的大脑运转起来: public class Registrat

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

  • 填写基本信息
  • 选择包
  • 说谢谢
  • 错误

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

    1个控制器
    注册控制器

    6种行动方法

    • 获取+发布索引(填写基本信息)
    • 获取+邮寄包裹
    • 去拿吧,谢谢
    • 找错
    这是一个粗略的代码,可以让你的大脑运转起来:

    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
        ....
    }
    
    因此,ControllerFactory能够将视图数据解析为已知的状态对象类型,并将执行传递给特定的操作。据国家统计。这将使它成为一个特别适合Asp.NETMVC应用程序的状态机

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

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

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

  • 这种状态模式不是常规Asp.net MVC开发人员会使用的,因为它很可能会比采用常规方法更复杂地使代码复杂化。分析后再作决定。Asp.net MVC是非常干净的代码,因此在其上添加额外的抽象可能会令人困惑。您的域模型(状态类)很可能有一个更复杂的代码,就像带有数据注释的简单POCO一样

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


  • 我认为你把美国搞糊涂了。国家安全的例子有:

  • 等待用户注册
  • 用户注册成功
  • 用户未成功注册
  • 现在,每个州都有一页:

  • 本地主机:8034/寄存器
  • 本地主机:8034/注册/成功
  • 本地主机:8034/寄存器/故障
  • 如果用户由于某些字段为空而无法注册,则这些字段将处于第一种状态,您将不得不显示一些验证消息

    因此,我至少会有一个名为Register的控制器和以下操作方法:

  • Index()获取/发布
  • 获得成功
  • 失败()获取

  • 谢谢你,罗伯特。但我对观点还有一个疑问。这里需要多少视图1或4?@共享:总共4个视图。每个州一个。但是你应该查看一些Asp.NETMVC介绍视频,让你明白这一点。Asp.net MVC的学习曲线非常短,因为它非常简单和纯粹,所以您不需要花费太长的时间来了解它,从而使它能够正常工作。这也会让你明白为什么每个州都需要一个视图。我想你知道Asp.NETWebForms,因为很可能只有一个aspx页面来处理所有这些…@Sharad:我对我的答案进行了一些编辑,因为你实际上只需要6个动作方法,而不是我第一次写的8个。但是你确实需要4个视图。@Sharad:我在我的回答中添加了一些重要信息,让你退一步,从开发人员和可维护性的角度考虑你的方法。谢谢Robert。这对我非常有用。他显然有两种注册状态,因为他希望注册过程分为两步。我的假设是,如果不选择包,注册就无法完成:)
    {StateObjectType}/{State}