怎么做"适当" MVC?

时间:2015-10-06 14:11:24

标签: c# asp.net-mvc razor umbraco

我是一名新的网络开发人员(约1年经验)刚刚加入一家新公司,该公司在我们开发的很多网站上使用Umbraco CMS。在我上一份工作中,我只接触过WebForms,所以我在开始这项工作之前对MVC进行了一些研究,并做了一个非常初学者的教程,但我不确定我是否了解社区和  #39; s"最佳做法"当谈到这些东西时,希望你们可以帮助我。对于Umbraco CMS,有一些名为" Macro-Scripts"这本质上是一个Razor View(.CSHTML),它允许你编写一堆C#&页面中的HTML并显示此"宏脚本"在您选择的任何CMS页面上。

在我的教程中(我在2个月前完成了),我想我曾经记得读过一些关于从不将条件逻辑/ C#与HTML混合的东西,并且使用模型&控制器?我有点困惑,因为我们不是真的为我们的网站构建控制器,因为它们是CMS页面,如果它们需要除Rich-Text之外的任何东西,那么我们只需创建一个"宏脚本"并将其放在需要扩展功能的页面上。

我在这里工作的第一个月发现,如果我能够在网站上重复使用我的代码,我可以节省很多时间,但我不太确定如何以一种“MVC友好&#34 ;?”的方式做到这一点这是一个例子&#34;宏脚本&#34;它显示在CMS中创建的表单,然后尝试抓住公司&#34;联系&#34;信息并将其显示在表单下方。我附加的示例非常简单,但是我已经看到的一些宏脚本变成了500多行的混乱,每个循环,交换机和不可读代码块都有很大的容量。< / p>

是否可以将此类代码拆分为模型以便在此视图中使用?拆分代码是否有任何好处,而不是将它们全部放在同一个视图中? (如果有足够的好处,我想向我的同事介绍这个并改变编码标准)。有人可以给我一个例子,看看如果将它分成适当的&#34; MVC&#34;?如果这不是发布此类问题的正确位置,请指向更好的StackExchange网站。感谢。

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

@inherits umbraco.MacroEngines.DynamicNodeContext

@*
    Model = The current page the macro is executed on
            @Model.bodyText

    Parameter = collection of parameter values passed from the macro
            @Paramter.myParam

    Library = utillity library with common methods
            @Library.NodeById(1233)
*@

@* The fun starts here *@

@{
    string formClass = "form-content";
    var configNode = Model.AncestorOrSelf().Descendants("ConfigurationContainer").FirstOrDefault();
    if (configNode != null && configNode.Id > 0)
    {
        formClass = "form-content show-address";
    }
    if (custom.Library.NodeHasPropertyAndValue(Model, "bodyText"))
    {
        <hr />
    }

    <div class="form-page contact-us">
        <div>
            <div class="@formClass">
               @Html.Raw(umbraco.library.RenderMacroContent("<?UMBRACO_MACRO macroAlias=\"umbracoContour.RazorRenderForm\" formGuid=\""+Model.selectedForm+"\" ></?UMBRACO_MACRO>", Model.Id))
            </div>
        @if (configNode != null && configNode.Id > 0)
        {
            <address class="address-content">
                @if (custom.Library.NodeHasPropertyAndValue(configNode, "officeAddress"))
                {
                    var addressDisplay = (custom.Library.NodeHasPropertyAndValue(configNode, "officeAddress2")) ? string.Format("{0}, {1}", configNode.officeAddress, configNode.officeAddress2) : configNode.officeAddress;
                    string locationString = string.Empty;
                    string cityDisplay = (custom.Library.NodeHasPropertyAndValue(configNode, "officeCity")) ? configNode.officeCity : string.Empty,
                    stateDisplay = (custom.Library.NodeHasPropertyAndValue(configNode, "officeState")) ? configNode.officeState : string.Empty,
                    zipDisplay = (custom.Library.NodeHasPropertyAndValue(configNode, "officeZip")) ? configNode.officeZip : string.Empty;
                    if (!string.IsNullOrEmpty(cityDisplay) && !string.IsNullOrEmpty(stateDisplay))
                    {
                        locationString = string.Format("<br />{0}, {1} {2}", cityDisplay, stateDisplay, zipDisplay);
                    }

                    @addressDisplay@Html.Raw(locationString)

                }
                @if (custom.Library.NodeHasPropertyAndValue(configNode, "officePhone"))
                {
                    <br /><i class="fa fa-phone"></i> @configNode.officePhone
                }
                @if (custom.Library.NodeHasPropertyAndValue(configNode, "officeFax"))
                {
                    <br /><i class="fa fa-fax"></i> @configNode.officeFax
                }
                @if (custom.Library.NodeHasPropertyAndValue(configNode, "officeEmail"))
                {
                    <br /><i class="fa fa-envelope"></i> <a href="mailto:@configNode.officeEmail">@configNode.officeEmail</a>
                }
            </address>
        }
        </div>
    </div>

    if (custom.Library.NodeHasPropertyAndValue(Model, "lowerText"))
    {
        @Html.Raw(Model.lowerText)
    }
}

1 个答案:

答案 0 :(得分:2)

我将在这里使用Umbraco术语,乍一看似乎不像Asp.Net MVC:

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

你应该做的第一件事是审查Umbraco文档(注意每个主题目标的Umbraco版本 - 那里还有Umbraco 4.10+特定内容):

https://our.umbraco.org/documentation/Reference/Templating/

关于拆分逻辑:

代码优先模型: 看看Umbraco Ditto - 这是一种使用Umbraco IPublishedContent模型的方法;它有相当多的文档,所以实现它应该相当简单。

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

https://our.umbraco.org/documentation/Reference/Routing/surface-controllers

渲染宏:不要使用@Html.Raw(umbraco.library.RenderMacroContent(..)) - 它已被弃用了。现在执行此操作的标准方法是使用@Umbraco.RenderMacro()。所以这个:

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

变为

@Umbraco.RenderMacro("FormsRenderForm", new { FormGuid = Model.selectedForm })

最后的想法:

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