【问题标题】:Using a ViewModel across multiple controller actions跨多个控制器操作使用 ViewModel
【发布时间】:2016-02-23 14:18:06
【问题描述】:

我正在创建一个 C# MVC 程序,用户可以在其中租用拖拉机设备。用户将选择他们想要的拖拉机类型(推土机、压路机等),然后被引导到一个屏幕,在那里他们可以选择制造该类型拖拉机的制造商(卡特彼勒、约翰迪尔等)。接下来,他们将被引导至该制造商提供的该类型拖拉机的可用型号列表。

目标是让 ViewModel 在每个步骤中存储他们的输入,以便我在结帐时收集他们的决定。如果重要的话,我在每个步骤中存储的唯一数据是每个选择的特定 ID,并且这一切都在使用多个操作的单个控制器中完成。最后,用户可以选择将另一辆拖拉机添加到他们的租借票上,或者直接按原样结账。因此,我需要一种方法来在开始新的租赁表单时初始化新的 ViewModel 对象,但如果他们选择在当前工单中添加更多拖拉机,则不创建新的 ViewModel 对象。

我的底线问题是,我似乎无法在租赁过程的第一步中找到创建 ViewModel 的方法,该 ViewModel 将在整个过程中持续存在,同时存储数据。

如有必要,我可以发布代码 sn-ps,但我主要只需要知道如何创建持久的 ViewModel 对象

【问题讨论】:

  • 我以前使用过 Session 属性来做类似的事情。请参阅:code.msdn.microsoft.com/How-to-create-and-access-447ada98stackoverflow.com/questions/20350327/… 我不确定它是否适用于不同的控制器,但它对我来说就像在同一控制器的方法之间共享数据的魅力。
  • 您可以使用TempDataSession,甚至可以将部分事务保存在数据库表中。
  • 您可以序列化为 JSON 并将其存储在每个后续表单的隐藏字段中。那么你就不需要使用会话状态了,
  • 为什么不只使用级联下拉列表(使用 ajax 根据第一个的值填充第二个),这样您就可以以一种形式完成所有这些操作,而无需进行不必要的重定向和持久化数据?
  • 当我回到它面前时,我会尝试其中一些(我今天不在办公室)。我可以具体回答的唯一评论是下拉内容:我的回复是我想创建一个他们可以单击的按钮列表,这些按钮将触发一个视图到下一个视图,并且还因为这是设计

标签: c# asp.net-mvc


【解决方案1】:

你可以这样设计。正如您正确提到的,在这种情况下,您的设计中最重要的部分是您的 viewModel。因此,让我们将您的 OO 知识与 MVC 结合起来;

   public class MultiStepViewModel
{
    public Step1Data Step1 { get; set; }
    public Step2Data Step2 { get; set; }
    public Step3Data Step3 { get; set; }

    public string StepSummary { get; set; }
}

Step1Data, Step2Data... 是单独的视图模型。它们是您的主视图模型的一部分,称为MultiStepViewModel

现在您必须为“MultiStepViewModel”(例如:MultiStepView)创建一个主视图。然后你可以为 Step1Data、Step2Data 等创建document templates

您可以使用选项卡、菜单或任何其他方法来启动您的步骤。 完成所有步骤后,您可以发布 MultiStepViewModel。它将包含您在每个步骤下填写的所有数据。

所以你的控制器会是这样的。

     public class MultiStepController : Controller
   {
    // GET: MultiStep
    public ActionResult Index()
    {
        return View(new MultiStepViewModel());
    }

    [HttpPost]
    public ActionResult PostMultiStepData(MultiStepViewModel model)
    {
        //your process logic
        if (success)
        {
            return View("It was successfull");
        }
        else
        {
            return RedirectToAction("Index", "MultiStep", model);
        }
    }
}

PS:确保在 MultiStepViewModel 的构造函数中初始化您的 Step 视图模型。我不确定您的 StepData 会是什么样子。如您所知,如果所有步骤都相同,则不需要多个视图模型。相反,您可以拥有一个 IENumerable 并相应地创建您的文档模板。

【讨论】:

  • 如果我正确理解了这个概念,你是在建议我为每个步骤制作一个不同的 ViewModel,然后有一个主 ViewModel 在使用它们时将它们全部连接在一起,以便在最后过程 我有一组 ViewModel 可以从中访问所有数据?
  • @AlexWatts:没错。这有助于您避免多次调用您的控制器,如果您遵循此方法,您对持久性的主要关注将不再是问题。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多