MS MVC:有没有办法在MVC视图中将C#代码与标记分开?

时间:2009-11-16 04:06:55

标签: c# asp.net-mvc

我们的广告部门推出了他们不断变化的Html代码(完全自我管理)。他们不了解JavaScript,更不用说C#等超出纯粹设计师的观点了。他们领域中的任何东西都将是纯粹的HTML和CSS(就像InDesign是PostScript打印一样)。所有这一切都是应该的(真正分开的问题)。

因此,在MS MVC视图中,看起来常规是使用<%=%>来使用C#代码绑定html。当然,如果我这样做,它将在下次更新时删除。使用JavaScript,我们只需使用JQuery找到我们需要的内容,然后添加适当的代码。

一个非常重要的想法,菲尔哈克在他的博客中注意到某些地方(请原谅我,如果我说错了)是在第一次访问的html中包括你第一次访问时需要的数据。 (如果我说错了,我再次道歉)这是因为繁重的交通网站在单独加载数据时会造成延迟,这是不可取的。

那么有没有办法将你的html标记与服务器上的C#代码伪分开,而不是单独使用JQuery客户端加载数据?我可以让它们根据需要分解HTML,比如我们用部分页面做。我甚至可以让他们根据需要添加带有HTML标签的占位符,因为这比编程更多XML,例如,
<productName> Apple </productName>

有什么想法吗?

5 个答案:

答案 0 :(得分:3)

您可能会考虑使用不同的 ViewEngine,例如NVelocity,NHaml,Spark

但是我不明白,如果他/她不知道什么是循环,那么这种情绪可能会如何呈现产品清单。

设计师应该知道某种语言(除了HTML / CSS)。

因此,您可以选择最适合设计师的ViewEngine。

答案 1 :(得分:3)

是的,有。使用HtmlHelper的RenderAction扩展并将该逻辑移回到它所属的控制器操作中。我在这里写了博客:

http://eduncan911.com/blog/html-renderaction-for-asp-net-mvc-1-0.aspx

基本上,RenderAction类似于RenderPartial - 除了它实际上在Controller上调用Action方法。这允许您从 View中调用控制器的操作方法,并将任何参数(例如Model,Route等)传递给action方法以编写代码。它通过将逻辑移回控制器,并使用由这些较小的操作方法调用加载的其他部分视图,大大简化了我们的视图。

RenderAction被认为是Asp.Net Mvc 1.0的一部分,但它没有在RC1之前进行切割。微软已经表示,它将在Asp.Net Mvc上市时发布。

史蒂文桑德森还写了一本书,其中包括在Pro Asp.Net Mvc Framework中广泛使用RenderAction。

答案 2 :(得分:2)

为什么要将代码放在视图中?您的视图应该基本上是格式化控制器从模型中获取的数据,不是吗?我理解这个问题必须“知道”ViewData中的数据是什么,但是如果你已经使用了红色药丸而去了MVC,那么你可能有一个辅助方法库,可以帮助你的设计师通过自动完成选择正确的东西。

答案 3 :(得分:2)

我强烈推荐Spark View Engine。以下是它的帮助:所有C#代码都将在Spark自定义元素中 - 基本上符合HTML规则。所以你的设计师可以忽略它们:

<div each="var product in Model.Products" if="Model.Products.Count > 0">
   <span class="${product.Class} another-product-class">${product.Name}</span>
   <ProductDetail renderClass="something" />
</div>
<else>No products</else>

现在,每个属性都包含用于循环记录的C#代码,$ {}包含要呈现的特定属性。请注意,$ {}可以被视为“示例内容”,而C#特定的代码可以被忽略为某些自定义HTML属性/标记 - 它仍然看起来像HTML。

另外,你注意到了ProductDetail标签吗?这就是Spark允许你渲染局部的方式。再次成为半HTML标签。你的设计师应该乐于看到它而不是

<% Html.RenderPartial("_ProductDetail", new { renderClass = "something" }) %>

除此之外,很高兴与您合作,提高您的工作效率,并允许Web Forms引擎没有的许多东西(如宏)。

从另一个角度来看,为什么设计师应该触摸视图代码呢?让他们使用CSS样式表,除了那些罕见的情况,当CSS不能没有修改布局时 - 你做了这个修复,设计师可以在CSS中做他们的。

P.S。当然,尽可能少地将C#代码放入视图中。

答案 4 :(得分:-3)

为广告部门使用内容管理/优化工具可能是另一种方法。然后,他们可以独立于您的实现/视图更改标记/广告。

Google's Website Optimizer等产品让开发人员定义网站上的区域(通常使用JavaScript和HTML),非开发人员可以更新。我曾经在一些采用这种方法的网站上工作,我认为它运作良好。