ASP中的状态模式.Net MVC 3.0
本文关键字:MVC Net 模式 状态 ASP | 更新日期: 2023-09-27 18:10:39
我的应用程序中有一个注册页面。它有3个状态和1个错误状态(如果出现任何错误):
- 填写基本信息
- 选择包
- 误差
现在我想使用状态模式。首先,我创建了一个控制台应用程序。现在我想在我的MVC应用程序中实现这个逻辑,但我对结构感到困惑。我的意思是我需要多少视图,模型和控制器,以及在哪里放置我的逻辑。
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应用程序的状态机。
更重要的问题当然是,你是否可以用这种模式创建整个应用程序,或者只是它的某些部分应该这样工作。当然,您可以将这两种方法结合起来,并为每种方法提供适当的路由。
重要通知你应该非常小心你如何定义你的错误状态,因为输入无效的字段数据不应该导致错误状态,而是在数据验证错误,实际上显示在视图与无效的数据字段旁边(即。无效日期为13/13/1313)。您的错误状态应该只用于与用户输入无关的实际对象状态错误。那将是什么超出了我的想象。
正如我在评论中提到的,你应该看看一些Asp.net MVC介绍视频,你会看到验证是如何在Asp.net MVC中工作的。也是非常简单的东西。
这种状态模式并不是一个普通的Asp.net MVC开发人员会使用的,因为它很可能会比普通的方法更复杂。做决定之前先分析一下。Asp.net MVC是非常干净的代码,所以添加额外的抽象可能会让人困惑。而你的领域模型(状态类)很可能有更复杂的代码,比如带有数据注释的简单poco。
在您的情况下,数据验证也将更加复杂(当与数据注释一起使用时),因为您的对象应该根据其状态进行验证,而状态之间可能不同。POCO对象的验证总是相同的。这可能意味着我们可以使用更多的类,但它们更小,更简单,更容易维护。
我认为你混淆了状态。状态的例子如下:
- 等待用户注册
- 用户注册成功
- 用户注册失败
现在每个州都有一个页面:
- localhost: 8034/注册
- localhost: 8034/注册/成功
- localhost: 8034/注册/失败
如果用户无法注册,因为他们留下了一些空字段,他们将处于第一状态,你将不得不显示一些验证消息。
因此,作为最小值,我将有一个名为Register的控制器和以下操作方法:
- Index() GET/POST
- 成功()
- 失败()