2

这更像是一个架构师问题,而不是一个需要代码的问题。

我有一个页面要求我显示特定项目的状态。为了简洁起见,假设有两种状态,打开和关闭。

当项目打开时,我想显示一个 PartialView,显示一组详细信息。如果项目已关闭,我想显示具有不同详细信息的 PartialView。

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

此外,还有两个以上的状态,因此“if”语句会堆积起来并变得混乱。

有没有人解决过这样的事情?

我应该创建一个助手来执行此操作吗?我可以在视图的 ActionResult 中处理这个并且我不确定如何执行此操作吗?例如,我可以在操作结果中呈现 PartialViews 并将其作为普通视图的一部分返回吗?

4

3 回答 3

7

您可以在控制器中执行逻辑并定义一个 ViewData 值,其中包含要渲染的部分名称......所以在控制器中,

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

然后在aspx中就做

<%=Html.RenderPartial(ViewData["StatusPartial"]) %>
于 2009-12-14T00:34:03.067 回答
5

如果您将项目的状态编码为,您实际上可以使用这个巧妙的技巧Enum在任何时候获得正确的部分显示而无需任何 if 子句:

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

在上面的示例中,我假设 的名称EnumProjStat,并且您有一个局部视图的命名约定,对应于两个状态值OpenPartial.ascxand 。ClosedPartial.ascxOpenClosed

于 2009-12-14T00:49:24.497 回答
4

我喜欢@Chris Gutierrez 的解决方案,但我会使用 ViewModel 上的属性而不是 ViewData 中的命名条目。您可以将它与控制器上的 Map 结合起来以节省一些代码——示例假定 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 ) %>
于 2009-12-14T02:13:44.743 回答