Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.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?_C#_Asp.net Mvc_Razor_Umbraco - Fatal编程技术网

C# “怎么做?”;“适当的”;MVC?

C# “怎么做?”;“适当的”;MVC?,c#,asp.net-mvc,razor,umbraco,C#,Asp.net Mvc,Razor,Umbraco,我是一名新的网络开发人员(~1年经验),刚刚加入了一家新公司,该公司在我们开发的许多网站上使用了Umbraco CMS。在我上一份工作中,我只接触过WebForms,所以在开始这份工作之前,我对MVC做了一些研究,并做了一个非常初级的教程,但我不确定我是否了解社区在这方面的“最佳实践”,所以希望你们能帮我。说到Umbraco CMS,有一些组件称为“宏脚本”,它本质上是一个Razor视图(.CSHTML),允许您在页面中编写一组C#&HTML代码,并在您选择的任何CMS页面上显示此“宏脚本” 在

我是一名新的网络开发人员(~1年经验),刚刚加入了一家新公司,该公司在我们开发的许多网站上使用了Umbraco CMS。在我上一份工作中,我只接触过WebForms,所以在开始这份工作之前,我对MVC做了一些研究,并做了一个非常初级的教程,但我不确定我是否了解社区在这方面的“最佳实践”,所以希望你们能帮我。说到Umbraco CMS,有一些组件称为“宏脚本”,它本质上是一个Razor视图(.CSHTML),允许您在页面中编写一组C#&HTML代码,并在您选择的任何CMS页面上显示此“宏脚本”

在我的教程中(我在两个多月前完成了该教程),我想我记得读过一些关于从不将条件逻辑/C#与HTML混合的内容,而且最好使用模型和控制器?我有点困惑,因为我们并没有真正为我们的网站构建控制器,因为它们是CMS页面,如果它们需要除富文本以外的任何内容,那么我们只需要创建一个“宏脚本”,并将其放置在需要扩展功能的页面上

我在这里工作的第一个月发现,如果我能够使代码在整个网站上重复使用,我可以节省很多时间,但我真的不知道如何以“MVC友好”的方式做到这一点?下面是一个“宏脚本”示例,它显示在CMS中创建的表单,然后尝试获取公司的“联系人”信息并将其显示在表单下面。我所附的示例非常简单,但我看到的一些宏脚本变成了500多行的混乱不堪,有大量for-each循环、开关和无法读取的代码块

是否可以将此类代码拆分为一个模型,以便在此视图中使用?与将代码全部放在同一视图中相比,拆分代码有什么好处吗?(如果有足够的好处,我想向我的同事介绍这一点,并改变编码标准)。有没有人能给我举个例子,说明如果将其拆分为适当的“MVC”,它会是什么样子?如果这不是发布此类问题的正确位置,请给我指一个更好的StackExchange站点。谢谢

获取CMS表单和公司信息的宏脚本

@继承umbraco.MacroEngines.dynamicontext
@*
Model=执行宏的当前页面
@Model.bodyText
Parameter=从宏传递的参数值的集合
@参数
库=具有常用方法的实用库
@Library.NodeById(1233)
*@
@*乐趣从这里开始*@
@{
字符串formClass=“表单内容”;
var configNode=Model.AncestorOrSelf().subjects(“ConfigurationContainer”).FirstOrDefault();
if(configNode!=null&&configNode.Id>0)
{
formClass=“表单内容显示地址”;
}
if(custom.Library.NodeHasPropertyAndValue(Model,“bodyText”))
{

}
@Html.Raw(umbraco.library.rendermacontent)(我将在这里使用umbraco术语,乍一看可能不像Asp.Net MVC:

你需要问问自己-你需要使用宏吗?如果你直接将宏嵌入到模板中,那么你可以使用PartialView(在/Views/Partials中找到,就像标准MVC一样),或者直接将布局合并到模板中(在/Views中找到)

您应该做的第一件事是查看Umbraco文档(注意每个主题目标的Umbraco版本-仍然有Umbraco 4.10+的特定内容):

关于逻辑的划分:

先编码型号: 看一看-这是一种将模型与Umbraco IPublishedContent一起使用的方法;有相当多的文档可供使用,因此实现起来应该相当简单

控制器: 您可以使用ASP.Net MVC控制器支持您的分区并提供模型;您需要从
SurfaceControllers
继承:

渲染宏:不要使用
@Html.Raw(umbraco.library.RenderMacroContent(..)
-它已被弃用。现在的标准方法是使用
@umbraco.RenderMacro()
。因此:

@Html.Raw(umbraco.library.RenderMacroContent("<?UMBRACO_MACRO macroAlias=\"umbracoContour.RazorRenderForm\" formGuid=\""+Model.selectedForm+"\" ></?UMBRACO_MACRO>", Model.Id))
最后的想法:


就个人而言,我不会使用宏来生成内容,除非您需要允许后台用户将功能嵌入页面并提供参数。如果不是这样,您最好直接在模板或局部视图中实现布局。

正如我所说的,因为您已经清楚地将对这个问题的思考太多了,它太宽泛了。你基本上是在问如何做MVC的骗子(.我要说的一件事是,
.chtml
视图中只应包含基本逻辑。您应传递已处理的对象,该对象包含显示页面所需的最小值,除基本循环(例如foreach循环)外,不需要进一步处理。任何处理都应该在控制器中完成,然后再传递给视图。我希望这会有所帮助!CodeReview可能是一个很好的SE站点。您的代码正在运行,您只是在寻找反馈和(潜在的)更好的方法。因为此问题特别涉及到Umbraco,它有自己的“特色”“从某种程度上讲,MVC的问题并不像它第一次出现时那样广泛——请参阅我下面关于清理问题的方法等的回答。您似乎需要查看有关MVC的Umbraco实施文档
@Html.Raw(umbraco.library.RenderMacroContent("<?UMBRACO_MACRO macroAlias=\"umbracoContour.RazorRenderForm\" formGuid=\""+Model.selectedForm+"\" ></?UMBRACO_MACRO>", Model.Id))
@Umbraco.RenderMacro("FormsRenderForm", new { FormGuid = Model.selectedForm })