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

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

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

我的应用程序中的一个区域显示了数据批次的列表,即
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别担心,如果您返回不同的模型,模板解决方案会起作用。我发布的链接非常详细,应该会为你指出正确的方向。这或多或少是我的路线。我更新了我的帖子来展示我所做的。