【问题标题】:What is this RenderAction doing, and how?这个 RenderAction 在做什么,怎么做?
【发布时间】:2009-06-02 14:24:36
【问题描述】:

我正在审阅一些第三方开发的 ASP.NET MVC 代码,在一个 View 中遇到了以下标记:

<div class="panel_body">   
    <% Html.RenderAction(((string[])Model)[0], "Customer"); %>
</div>
<!-- Some HTML omitted -->
<div class="wizard_body">
    <% Html.RenderAction(((string[])Model)[0], "Journey"); %>
</div>       

谁能告诉我为什么模型需要这样的转换和数组访问?

视图不是强类型的。

两个RenderActions 正在渲染两个独立的视图,它们在两个独立的 ASP.NET MVC 项目中定义。

编辑

这个视图是使用以下操作方法启动的

public ActionResult Index()
{
    return View(new []{"Search"});
}

因此((string[])Model)[0] 将返回"Search"

【问题讨论】:

  • 你在追求什么?您描述了正在发生的事情,那么您还在寻找什么?
  • 我试图弄清楚为什么需要强制转换和数组访问,即 ((string[])Model)[0]

标签: asp.net-mvc


【解决方案1】:

因为视图不是强类型的,Model 是对象类型。显然,他们实际上已经为 Model 变量分配了一个字符串数组,并且要呈现的动作的名称是数组的第一个元素。因此,他们将模型转换为字符串数组并提取第一个元素。

编辑:如果确实如此,那么您可以通过将视图强类型化为string[] 来避免强制转换。他们可以简单地进行索引。代码本身让我对它的质量有点怀疑。我可能会将动作名称放入 ViewData 并按名称引用它,或者使用具有视图特定模型的强类型视图,以便我可以通过属性名称来引用动作。无论哪种方式都会比你所拥有的更清楚。我建议使用特定于视图的模型重构为强类型视图,除非这是以这种方式引用的唯一属性。

编辑 2:根据您的更新,我会将其更改为:

public ActionResult Index()
{
    return View();
}

<div class="panel_body">   
    <% Html.RenderAction("Search", "Customer"); %>
</div>
<!-- Some HTML omitted -->
<div class="wizard_body">
    <% Html.RenderAction("Search", "Journey"); %>
</div>

如果值是固定的,为什么还要将其作为模型的一部分传递?

【讨论】:

  • 我同意 - 并且对代码中采用的方法感到有些困惑......
  • 我同意 tvanfosson 关于代码的气味因素。只是因为它表明原作者可能不知道如何干净利落地做他们想做的事情。
猜你喜欢
  • 2011-07-01
  • 2012-07-09
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
相关资源
最近更新 更多