2

我使用umbraco 7 mvc渲染部分视图中的umbraco字段

我只是想在部分视图中渲染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 }) 

感谢

回答

3

我没有测试过这可言,但是这应该让你去正确的道路.. ,尽我所能告诉,要更换此:

@model MvcImport.Models.ImportModel 

有了这个:

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

这应该给你的UmbracoHelper访问,并允许您访问属性,像这样:

@Umbraco.Field("thankYouCopy") 
+1

yeahaaa它的工作原理。我试过Umbraco.Web.Mvc.UmbracoViewPage ,可能只有@CurrentPage,这就是为什么它以前不适合我。但与Umbraco.Field很好地合作(..)谢谢@ c0r3yz! – nickornotto

3

我们有几件事情在这里混了。当您尝试从Umbraco节点获取数据时,您有自定义模型。

您正在使用自定义模型传递给您的视图。像@ c0r3yz提到你可以改变传递给视图的模型。如果你有RenderMvcControllerSurfaceController这可能是一个好主意。

如果您对目前的控制器感到满意(不管这是什么),您可以使用do @Model.MyPropertyName来显示想要的值。如果你不想要任何的umbraco功能(如当前节点等),这是非常好的。

您提到的所有字段检索选项都是相似的。他们所做的是检索当前节点的信息。因为您使用的是自定义模型,所以只有从前面讨论的umbraco基类继承自定义模型之后,才能使用它们。

  • @Umbraco.Field("myfield")是一个helper method它可以帮助您获取和格式化正确的领域。这对于初学者来说可能是最简单的解决方案。其中一个非常强大的功能是recursive = true。有关详细信息,请参阅documentation
  • @CurrentPage.myField返回字段的值(使用动态)。这很容易编写,但有时候可能会让你遇到意外情况。
  • @Umbraco.Content.GetPropertyValue("myField")返回该字段的值。与完全相同的部分,但使用(和返回)强类型的方法/对象。如果你使用Visual Studio,你可能会喜欢intellisense部分。
  • @Umbraco.Content.GetPropertyValue<ACustomType>("myField")使用ValuePropertyConverters返回该字段的值。如果您使用上一个并且不指定类型,则也会使用propertyconverters。但是用这种表示法可以更多地控制返回的类型。

我已经添加了一些指向文档的链接,以便查找有关不同选项的更多信息。

+0

谢谢@dampee。你确定我正在混合东西。但我不明白为什么我不能在UmbracoTemplatePage中使用自定义模型?我有一个控制器,从excel导入数据,并希望将它们返回到列表中以在视图中显示。但是,当我同时使用@model MyModel和@inherits UmbracoTemplatePage指令我得到错误我不能使用这两个,当我只使用@model然后它喊'模型传递到字典是类型'System.Collections.Generic.List'1 [MvcImport.Models.CourseImport]',但是这个字典需要一个'Umbraco.Web.Models.RenderModel'类型的模型项目:( – nickornotto

+0

只需添加我不想在这个阶段创建每行的umbraco节点,我只需要在页面上显示数据或部分视图 – nickornotto

+0

我在这里描述了上述问题http://stackoverflow.com/questions/25158951/umbracotemplatepage-and-strongly-typed-view-not-working-together。 – nickornotto