gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:41:41 24 4
gpt4 key购买 nike

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

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

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

最佳答案

1个 Controller :RegistrationController

6个 Action 方法:

  • 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 相关的代码来处理状态更改。在我的示例中,一切都在操作方法中完成。但也可以使用 Action 过滤器。如果您不能想出一个可以为许多不同状态对象提供服务的通用操作过滤器,那么最好只在操作方法中编写代码。

另一种方法

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

{StateObjectType}/{State}

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

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

重要通知

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

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

  2. 这种状态模式不是常规 Asp.net MVC 开发人员会使用的东西,因为它很可能会使代码比采用正常方法更复杂。先分析再做决定。 Asp.net MVC 的代码非常简洁,因此在其上添加额外的抽象可能会造成混淆。并且您的领域模型(状态类)很可能具有复杂得多的代码,如带有数据注释的简单 POCO。

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

关于c# - ASP.NET MVC 3.0 中的状态模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com