2009-12-14 134 views
2

这更像是一个架构师问题,而不是需要代码的问题。ASP.NET MVC - PartialView体系结构问题

我有一个页面需要我显示特定项目的状态。为了简洁起见,有两个州,即开放和封闭。

当项目打开时,我想显示一个PartialView,向我显示一组细节。如果项目已关闭,我想用不同的细节显示PartialView。

现在我知道我可以在aspx中进行检查并渲染一个或另一个,但我试图减少aspx代码中的决策点数量。我相信在aspx中应该有最少的实际代码。

另外,还有两种状态,所以“if”语句会堆积并变得混乱。

有没有人处理过这样的事情?

我应该创建一个助手来做到这一点吗?我可以,我不确定如何做到这一点,在视图的ActionResult中处理这个问题?例如,我可以渲染动作结果中的部分视图并将其作为普通视图的一部分返回吗?

回答

7

你可以做逻辑控制器,并定义包含部分呈现的名称ViewData的价值......所以在控制器,

if (Project.Status == "Open") { 
    ViewData["StatusPartial"] = "OpenPartial"; 
} else { 
    ViewData["StatusPartial"] = "ClosedPartial"; 
} 
在ASPX

然后就去做

<%=Html.RenderPartial(ViewData["StatusPartial"]) %> 
+0

+1。到目前为止,我喜欢这个想法。谢谢。 – griegs 2009-12-14 00:38:38

+0

非常简单,并保持它应该的逻辑。我喜欢。 – 2009-12-14 08:27:36

+0

这是迄今为止最简单的解决方案,但它有两个缺陷: *“魔术串”(好吧,也许不是那么神奇 - 但它们不是强类型的) *将项目状态信息冗余保存在两个('ViewData [“StatusPartial”]'和模型对象的属性) – 2009-12-14 10:21:18

5

如果代码作为Enum项目的状态,您可以实际上只是得到正确的部分是没有表现出任何条款,如果在任何时候,使用this neat trick

<% Html.RenderPartial(Enum.GetName(typeof(ProjStat), prj.Status) + 'Partial'); %> 

在上面的例子中,我假定Enum的名字是ProjStat,那你有你的局部视图对应OpenPartial.ascxClosedPartial.ascx两个状态的命名约定值OpenClosed

+0

这是一个非常酷的解决方案!好主意! – 2009-12-14 01:23:06

+0

+1,是的,这实际上很整齐。 – griegs 2009-12-14 01:40:42

4

我喜欢@Chris Gutierrez的解决方案,但我会在您的ViewModel上使用一个属性,而不是ViewData中的一个命名条目。你可能会结合起来,与控制器上的地图,以节省一点代码 - 示例假设Status.Open映射到0,Status.Closed映射到1

private readonly static string[] StatusViews 
    = new string[] { "OpenPartial", "ClosedPartial" }; 

... 
model.StatusView = StatusViews[(int)Project.Status]; 


<%= Html.RenderPartial(Model.StatusView) %> 
+0

+1。对,为了使其可扩展,我可以从db或config中加载值。 – griegs 2009-12-14 03:24:06

+0

这是对克里斯解决方案的一个很好的修改 - 然而,这个视图很可能已经呈现了关于这个项目的其他内容,并且将状态既作为“项目”实体的属性也作为单独的特性看起来是多余的在'ViewModel'上。 – 2009-12-14 10:18:10

+0

Grnated我只在MVC工作了一年多一点,但我所吸引的模式是每个视图单独的仅查看模式。这种视图模型通常会为业务模型包含一些额外的视图项目,例如,在这种情况下,如果有选项,哪个部分可以选择。我不确定我是怎么处理这个问题的 - 我不愿意在我的视图中使用逻辑**和**选择如何渲染某些东西似乎对我来说不是控制器的功能。可能我只是在视图中使用基于模型属性的if/then/else构造。 – tvanfosson 2009-12-14 12:43:14