我正在创建一个C#MVC程序,用户可以在其中租用拖拉机设备。用户将选择他们想要的拖拉机类型(推土机,滚筒等),然后被引导到一个屏幕,在那里他们可以选择制造这种类型拖拉机的制造商(卡特彼勒,约翰迪尔等)。接下来,他们将被引导至该制造商的该类型拖拉机的可用型号列表。
目标是让ViewModel在每一步都存储他们的输入,以便我在结账时收集他们的决定。如果重要的话,我在每个步骤中存储的唯一数据是每个选项的特定ID,并且这是使用多个Actions在单个Controller中完成的。最后,用户可以选择在他们的租车票上添加另一台拖拉机,或者只是按原样退房。因此,我需要一种方法来在启动新的租用表单时初始化新的ViewModel对象,但如果他们选择在当前票证中添加更多拖拉机,则不需要创建新的ViewModel对象。
我的底线问题是,我似乎找不到在租借程序的第一步中创建ViewModel的方法,该步骤将在整个过程中持续存储,并在数据存储过程中存储数据。
如果有必要,我可以发布代码片段,但我主要只需要知道如何创建持久的ViewModel对象
答案 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; }
}
Step1Data
,Step2Data
...是各自的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并相应地创建您的文档模板。