Asp.net mvc ASP.NET MVC 2-如何根据模型上下文正确切换视图?
我正在组装我的第一个MVC应用程序,我有一个关于如何正确实现我的目标的问题。这是我正在尝试的 我的应用程序中的一个区域显示了数据批次的列表,即Asp.net mvc ASP.NET MVC 2-如何根据模型上下文正确切换视图?,asp.net-mvc,asp.net-mvc-2,asp.net-mvc-routing,Asp.net Mvc,Asp.net Mvc 2,Asp.net Mvc Routing,我正在组装我的第一个MVC应用程序,我有一个关于如何正确实现我的目标的问题。这是我正在尝试的 我的应用程序中的一个区域显示了数据批次的列表,即Batch对象的列表。对于每个批次,用户可以选择处理其数据。处理过程包括一组步骤,我将以类似向导的视图链向用户展示这些步骤 每批都有一个类型。类型为L的批次A可能包含X的记录,类型为M的批次B可能包含Y的记录。向导中的步骤将根据批次类型略有变化。我不想做的是(显然是糟糕的代码,只是为了说明): ProcessController public Action
Batch
对象的列表。对于每个批次
,用户可以选择处理其数据。处理过程包括一组步骤,我将以类似向导的视图链向用户展示这些步骤
每批都有一个类型。类型为L的批次A可能包含X的记录,类型为M的批次B可能包含Y的记录。向导中的步骤将根据批次类型略有变化。我不想做的是(显然是糟糕的代码,只是为了说明):
ProcessController
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();
}
}
...
public ActionResult Process(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
return RedirectToAction("StepOne", batch.BatchType, new { id = batch.Id });
}
等等。这似乎是一种不好的做法,由于我的向导可能需要4或5个步骤,而且我目前有三种不同的批处理类型,这些操作中的代码量变得非常难以维护
MVC在管理这方面能为我做些什么?例如,如果引入了第四种类型,我希望尽量减少所需的工作量
我知道我可能会:
- 每个批次类型的局部视图
在向导中,有
真的没有办法,尽管有些局部视图可能会被共享
那么,对于每种批处理类型,是否最好有一个专用控制器?我想我可以这样做,批处理类型成为控制器名称
BatchController
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();
}
}
...
public ActionResult Process(int id)
{
var batch = BatchRepository.Batch.SelectById(id);
return RedirectToAction("StepOne", batch.BatchType, new { id = batch.Id });
}
但这取决于与控制器名称匹配的批处理类型名称,我也不一定喜欢这样更新:或者,最坏的情况是,我在这里有一个包含三种批处理类型的开关语句,然后我可以转发到相应的控制器
所以。。。思想!我需要他们。我还没到不能开始新的事情的地步,我只是作为一个MVC新手在脑子里胡思乱想。MVC必须具备允许基于上下文的动态视图切换的功能,无论是通过奇特的路由技术还是“ViewFactory”或其他技巧
任何反馈都将不胜感激
对于任何想知道的人来说,我被困在了.NET3.5和IIS6上,这就是为什么我回到了MVC2而不是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);
}
它很快,看起来很脏,但在我学到更好的东西之前。。。谢谢 您不需要switch语句。在适当的位置创建DisplayTemplates或EditorTemplates文件夹,例如Views/Shared/并创建RecordType.cshtml文件,然后更改return语句以仅返回模型。比如说
-View
-Shared
-DisplayTemplates
-MyRecordTypeA.cshtml
-MyRecordTypeB.cshtml
return View(records)
希望这能有所帮助。约定优于配置(新的硬编码),简单如下:
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);
}
-1:这不是Razor和MVC3的一个特性吗?我用的是MVC2。事实上,这在这种情况下不起作用,因为他返回的是相同的型号。他需要将模型包装到另一个模型(“ModelWithBatchTypeA”等)中,然后为这些模型创建模板化视图和编辑器。但是,switch方法比该示例更好。@cory不,它是MVC2的一部分@我可能误解了xixonia,但他确实提到了每个批次都是自己的类型。哦,对不起,除非问题被编辑,否则它不会让我撤销我的否决票。@cory别担心,如果您返回不同的模型,模板解决方案会起作用。我发布的链接非常详细,应该会为你指出正确的方向。这或多或少是我的路线。我更新了我的帖子来展示我所做的。