Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 微软MVC:有没有办法在MVC视图中将C代码与标记分离?_C#_Asp.net Mvc - Fatal编程技术网

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

C# 微软MVC:有没有办法在MVC视图中将C代码与标记分离?,c#,asp.net-mvc,C#,Asp.net Mvc,我们的广告部门不断推出Html代码,他们不断地修改(并完全自行管理)。他们对JavaScript一无所知,更不用说C#等了。这超出了纯粹设计师的观点。他们领域中的任何内容都将是纯HTML和CSS(就像InDesign是PostScript打印一样)。所有这些都是应该的(真正分离的关注点) 因此,在MS MVC视图中,规范似乎是使用C#代码来添加html。当然,如果我这样做,它将被删除下一次更新。使用JavaScript,我们只需找到JQuery所需的内容,然后添加适当的代码 Phil Haack

我们的广告部门不断推出Html代码,他们不断地修改(并完全自行管理)。他们对JavaScript一无所知,更不用说C#等了。这超出了纯粹设计师的观点。他们领域中的任何内容都将是纯HTML和CSS(就像InDesign是PostScript打印一样)。所有这些都是应该的(真正分离的关注点)

因此,在MS MVC视图中,规范似乎是使用C#代码来添加html。当然,如果我这样做,它将被删除下一次更新。使用JavaScript,我们只需找到JQuery所需的内容,然后添加适当的代码

Phil Haack在他的博客中提到的一个非常重要的想法(如果我说的不对,请原谅)是在第一次访问的html中包含第一次访问所需的数据。(如果我陈述错误,我再次道歉)这是因为流量大的网站在单独加载数据时会造成延迟,这是不可取的

有没有一种方法可以将html标记与服务器上的C代码伪分离,而不是用JQuery客户端单独加载数据?我可以让他们根据需要分解html,就像我们处理部分页面一样。我甚至可以让他们根据需要添加带有HTML标记的占位符,因为这更多的是XML而不是编程,例如,
Apple


有什么想法吗?

您可能会考虑使用不同的视图引擎,例如NVelocity、NHaml、Spark

但我不明白,如果设计者不知道循环是什么,他/她怎么可能呈现产品列表

设计师应该知道某种语言来实现这一点(除了HTML/CSS)


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


像这样的产品可以让开发人员在网站上定义非开发人员可以更新的区域(通常使用JavaScript和HTML)。我曾在几个采用这种方法的网站上工作过,我认为效果很好

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

基本上,RenderAction与RenderPartial类似,只是它实际上调用了控制器上的动作方法。这允许您从视图中调用控制器的动作方法,并将任何参数(如模型、路由等)传递到动作方法中以编写代码。通过将该逻辑移回控制器,并使用那些较小的操作方法调用加载的附加部分视图,它极大地简化了我们的视图

RenderAction本来应该是Asp.NETMVC1.0的一部分,但它在RC1之前并没有出现。微软表示,在Asp.NETMVC发布后,它将被包括在Asp.NETMVC中


Steven Sanderson还写了一本书,书中广泛使用了渲染技术。

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

我强烈推荐。下面是它的帮助:所有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>

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

另外,您注意到ProductDetail标签了吗?这就是Spark允许您渲染片段的方式。再次使用半HTML标记。您的设计师应该乐于看到它,而不是

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

除此之外,使用它是一种乐趣,它可以提高您的工作效率,并允许实现Web表单引擎所不具备的许多功能(如宏)

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


当然,在视图中输入尽可能少的C#代码。

+1用于不同的视图引擎,但我不确定您的其余答案与问题的相关性。视图引擎实际上不应该与设计师有任何关联,因为设计师将使用图形和CSS,并且不应该看到视图代码。@Robert:许多web设计师使用他们的设计和html/CSS,因此他们必须知道视图标记。然而,许多模板语言对于设计师来说都相当容易理解,特别是如果开发人员首先创建一个简单的HTML文件的话。@Robert,我的观点是设计师确实知道某种标记语言。否则,他/她将无法产生任何动态输出。例如产品列表。由于HTML是静态的,所以无法使用糟糕的HTML/CSS(动态)生成产品列表。设计师熟悉HTML/CSS和布局“部件”。他们可视化地设计内容,可能添加文本作为数据占位符。例如,他们知道如何为每种不同的产品类型创建独特的布局,但不知道它们是如何神奇地组装起来的。例如,在我们的母版页中,我们包含了它们的html代码片段,但它们不是数据驱动的。html代码段中不包含用于工作的C#代码