ASP中的状态模式.Net MVC 3.0

本文关键字:MVC Net 模式 状态 ASP | 更新日期: 2023-09-27 18:10:39

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

  1. 填写基本信息
  2. 选择包
  3. 误差

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

ASP中的状态模式.Net MVC 3.0

1控制器: RegistrationController

6个动作方法:

  • GET+POST查询索引(填写基本信息)
  • GET+POST
  • GET for Thank you
  • GET for Error

这是一个粗略的代码,让你的头脑:

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. 这种
  3. 状态模式并不是一个普通的Asp.net MVC开发人员会使用的,因为它很可能会比普通的方法更复杂。做决定之前先分析一下。Asp.net MVC是非常干净的代码,所以添加额外的抽象可能会让人困惑。而你的领域模型(状态类)很可能有更复杂的代码,比如带有数据注释的简单poco。

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

我认为你混淆了状态。状态的例子如下:

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

现在每个州都有一个页面:

  1. localhost: 8034/注册
  2. localhost: 8034/注册/成功
  3. localhost: 8034/注册/失败

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

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

  1. Index() GET/POST
  2. 成功()
  3. 失败()