跨多个控制器操作使用ViewModel

时间:2015-11-20 23:30:03

标签: c# asp.net-mvc

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

目标是让ViewModel在每一步都存储他们的输入,以便我在结账时收集他们的决定。如果重要的话,我在每个步骤中存储的唯一数据是每个选项的特定ID,并且这是使用多个Actions在单个Controller中完成的。最后,用户可以选择在他们的租车票上添加另一台拖拉机,或者只是按原样退房。因此,我需要一种方法来在启动新的租用表单时初始化新的ViewModel对象,但如果他们选择在当前票证中添加更多拖拉机,则不需要创建新的ViewModel对象。

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

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

1 个答案:

答案 0 :(得分: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; }
}

Step1DataStep2Data ...是各自的viewModel。它们是主视图模型的一部分,称为MultiStepViewModel

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

您可以使用标签,菜单或任何其他方法来启动您的步骤。 完成所有步骤后,您可以发布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会是什么样子。如果所有步骤都相同,您可能知道,则不需要多个viewMOdels。相反,您可以拥有一个IENumerable并相应地创建您的文档模板。