【发布时间】:2011-04-08 18:53:12
【问题描述】:
我正在整理我的第一个 MVC 应用程序,并且有一个关于如何正确实现我的目标的问题。这是我正在尝试的...
我的应用程序中的一个区域显示了一批数据的列表,即Batch 对象的列表。对于每个Batch,用户可以选择处理其数据。该处理由一组步骤组成,我将以类似向导的视图链向用户展示这些步骤。
每个Batch 都有一个类型。 L 类型的批次 A 可能包含 X 的记录,而类型 M 的批次 B 可能包含 Y 的记录。向导中的步骤将根据批次类型略有变化。我不想做的是这个(显然是糟糕的代码,只是为了说明):
流程控制器
public ActionResult StepOne(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
switch (batch.BatchType)
{
case "X":
return View("TypeXStepOne", records);
case "Y":
return View("TypeYStepOne", records);
default:
return View();
}
}
public ActionResult StepTwo(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
switch (batch.BatchType)
{
case "X":
return View("TypeXStepTwo", records);
case "Y":
return View("TypeYStepTwo", records);
default:
return View();
}
}
...
等等。这似乎是一种不好的做法,因为我的向导可能是 4 或 5 步,而我目前有三种不同的批处理类型,这些操作中的代码量变得难以维护。
在管理这方面,MVC 能为我做些什么?例如,如果引入了第四种类型,我想尽量减少所需的工作量。
我知道我可能会有:
- 每个批次类型的局部视图 并进入向导,有 确实没有办法解决这个问题,尽管可能会分享一些部分观点。
那么,每个批次类型都有一个专用控制器会更好吗?我想我可以做这样的事情,其中批处理类型成为控制器名称。
批处理控制器
public ActionResult Process(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
return RedirectToAction("StepOne", batch.BatchType, new { id = batch.Id });
}
但这取决于与控制器名称匹配的批处理类型名称,我也不一定喜欢这样。 更新:或者,最坏的情况是,我在这里有一个包含三种批处理类型的 switch 语句,然后我可以转发到相应的控制器。
所以...想法!我需要他们。而且我还没有到这一步,我不能开始新的东西,我只是作为一个 MVC 新手在我的脑海中抛出一些想法。 MVC 必须具有允许基于上下文进行动态视图切换的功能,无论是通过花哨的路由技术还是“ViewFactory”或其他一些技巧。
任何反馈都将不胜感激!
对于任何想知道的人,我被困在 .NET 3.5 和 IIS6 上,这就是为什么我回到 MVC 2 而不是 3。
UDPATE
这就是我现在正在滚动的内容。我将 BatchController 分成多个控制器——每个批次类型一个。由于它们大多相同,我创建了一个抽象的WizardController,其中包含这些方法:
public abstract ActionResult Step(int batchId, int stepNumber);
protected ViewResult ViewStep(int stepNumber, object model)
{
return View(string.Format("Process\Step{0}", stepNumber), model);
}
在我的派生控制器中,类似:
public override ActionResult Step(int batchId, int stepNumber)
{
var data = BatchRepository.BatchType.SelectByBatchId(batchId);
return ViewStep(stepNumber, data);
}
它很快而且看起来很脏,但在我学到更好的东西之前......谢谢!
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing