gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 2 - 如何根据模型上下文正确切换 View ?

转载 作者:行者123 更新时间:2023-12-02 02:26:51 25 4
gpt4 key购买 nike

我正在组装我的第一个 MVC 应用程序并且有一个关于如何正确实现我的目标的问题。这就是我正在尝试的...

我的应用程序中的一个区域显示了一批数据的列表,即 Batch 对象的列表。对于每个 Batch,用户可以选择处理它的数据。该处理过程包含一组步骤,我将在类似向导的 View 链中向用户展示这些步骤。

每个 Batch 都有一个类型。类型 L 的批处理 A 可能包含 X 的记录,类型 M 的批处理 B 可能包含 Y 的记录。向导中的步骤将根据批处理类型略有变化。我不想做的是这个(显然是糟糕的代码,仅供说明):

进程 Controller

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 能为我做什么?例如,如果引入了第四种类型,我想尽量减少所需的工作量。

我知道我可能会:

  • 每种批处理类型的局部 View 然后进入向导,有确实没有办法解决这个问题,尽管一些部分观点可能会被分享。

那么,每个批处理类型都有一个专用 Controller 会更好吗?我想我可以做这样的事情,其中​​批处理类型成为 Controller 名称。

批处理 Controller

public ActionResult Process(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
return RedirectToAction("StepOne", batch.BatchType, new { id = batch.Id });
}

但这取决于与 Controller 名称匹配的批处理类型名称,我也不一定喜欢这样。 更新:或者,最坏的情况是,我在这里有一个带有我的三种批处理类型的 switch 语句,然后我可以转发到适当的 Controller 。

所以...想法!我需要他们。而且我还没有深入到无法开始新事物的程度,作为 MVC 新手,我只是在脑海中抛出一些想法。 MVC 必须有一些允许基于上下文的动态 View 切换的东西,无论是通过花哨的路由技术还是“ViewFactory”或其他一些技巧。

如有任何反馈,我们将不胜感激!

对于任何想知道的人来说,我被困在 .NET 3.5 和 IIS6 上,这就是我回到 MVC 2 而不是 3 的原因。

更新

这就是我目前正在使用的内容。我将 BatchController 分成多个 Controller ——每个批处理类型一个。由于它们大部分相同,我创建了一个具有以下方法的抽象 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);
}

在我派生的 Controller 中,类似:

public override ActionResult Step(int batchId, int stepNumber)
{
var data = BatchRepository.BatchType.SelectByBatchId(batchId);

return ViewStep(stepNumber, data);
}

它很快而且看起来很脏,但直到我学到更好的东西......谢谢!

最佳答案

约定优于配置(新的硬编码),就像这样简单:

public ActionResult Step(int stepNo, int id)
{
var batch = BatchRepository.Batch.SelectById(id);
var records = BatchRepository.Data.SelectForBatch(batch);
return View("Type"+batch.BatchType+"Step"+stepNo, records);
}

关于asp.net-mvc - ASP.NET MVC 2 - 如何根据模型上下文正确切换 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599548/

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