在部分视图中呈现Umbraco字段

4

我使用的是Umbraco 7 MVC。

我只是想在一个部分视图中呈现Umbraco字段。但是不知道该怎么做。 @CurrentPage或@Umbraco.Field或RenderMacro等都不起作用。

我有以下部分视图:

@model MvcImport.Models.ImportModel
@{
    var formSent = false;
    var success = TempData["Success"];
    if (success != null)
    {
        bool.TryParse(success.ToString(), out formSent);
    }
}

<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@if (formSent)
{

    <p>Thanks, we'll get back to you soon!</p>
}
else
{
    using (Html.BeginUmbracoForm<MvcImport.Controllers.ImportController>("ImportExcel", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)

        <div>

            @Html.LabelFor(x => x.FileUpload)
            @Html.TextBoxFor(x => x.FileUpload, new { type = "file", name = "Files" })
            @Html.ValidationMessageFor(x => x.FileUpload)

        </div>
        <div>

            @Html.LabelFor(model => model.FileType)<br />
            @Html.DropDownListFor(model => model.FileType, Model.FileTypes)
            @Html.ValidationMessageFor(x => x.FileType)

        </div>
        <input type="submit" value="Submit" class="btn-submit" />
    }
}

我只是想替换

<p>Thanks, we'll get back to you soon!</p>

使用当前页面字段,例如:

@currentPage.thankYouCopy

或者
@Umbraco.Field("thankYouCopy")

如何实现?

在我的主视图中,我通过以下方式调用部分视图:

@Html.Partial("Import", new MvcImport.Models.ImportModel { FileTypes = fileTypes })

谢谢

2个回答

4

我没有进行过任何测试,但这应该可以让你朝着正确的方向前进......据我所知,您想要替换此代码:

@model MvcImport.Models.ImportModel

使用这个:

@inherits Umbraco.Web.Mvc.UmbracoViewPage<MvcImport.Models.ImportModel>

这将使您能够访问UmbracoHelper,并像这样访问属性:
@Umbraco.Field("thankYouCopy")

1
太好了,它起作用了。我尝试了Umbraco.Web.Mvc.UmbracoViewPage<MvcImport.Models.ImportModel>,可能只是因为@CurrentPage,这就是为什么之前它对我不起作用的原因。但是使用Umbraco.Field(..)非常好。感谢@c0r3yz! - nickornotto

4
我们这里有一些混淆的东西。您正在使用自定义模型,同时尝试从Umbraco节点获取数据。
您正在使用自定义模型传递给视图。像@c0r3yz提到的那样,您可以更改传递给视图的模型。如果您有RenderMvcControllerSurfaceController,这可能是个好主意。
如果您对当前控制器(无论是什么)感到满意,可以使用@Model.MyPropertyName来显示所需的值。如果您不想要任何umbraco功能(例如当前节点等),这完全可以。
您提到的所有字段检索选项都相似。它们所做的是检索当前节点的信息。因为您正在使用自定义模型,所以在继承自像之前讨论过的umbraco基类之前,您不能使用它们。
  • @Umbraco.Field("myfield")是一个帮助方法,可以帮助您获取和格式化正确的字段。这可能是初学者最简单的解决方案。其中一个非常强大的功能是recursive=true。请参阅文档以了解更多信息。
  • @CurrentPage.myField使用dynamics返回字段的值。这很容易编写,但有时可能会遇到意外情况。
  • @Umbraco.Content.GetPropertyValue("myField")返回字段的值。与partial相同,但使用(并返回)强类型方法/对象。如果您使用Visual Studio,则可能喜欢intellisense部分。
  • @Umbraco.Content.GetPropertyValue<ACustomType>("myField")使用ValuePropertyConverters返回字段的值。如果您使用前面的方法而不指定类型,则也将使用propertyconverters。但是,使用此符号可以稍微控制返回的类型。

我已经添加了一些文档链接,所以你可以查阅更多关于不同选项的信息。


感谢 @dampee。你说得没错,我混淆了一些东西。然而我不明白为什么我不能在UmbracoTemplatePage中使用自定义模型?我有一个控制器从Excel导入数据,并希望将它们返回到列表中以在视图中显示。但是当我同时使用@model MyModel和@inherits UmbracoTemplatePage指令时,我会收到错误提示,这两个都不能使用,只使用@model时则会出现“传递到字典中的模型类型为'System.Collections.Generic.List`1 [MvcImport.Models.CourseImport]',但是该字典需要一个类型为'Umbraco.Web.Models.RenderModel'的模型项 :(” 的警告。 - nickornotto
只是想补充一下,我现阶段不想创建每一行的Umbraco节点,我只需要在页面或部分视图上显示数据。 - nickornotto
我在这里描述了上述问题 http://stackoverflow.com/questions/25158951/umbracotemplatepage-and-strongly-typed-view-not-working-together。 - nickornotto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接