2

在 Umbraco 7.0.3 中我:

  1. 使用宏容器的属性编辑器创建了一个名为宏容器的数据类型
  2. 创建的文档类型称为联系表单,属性称为正文,类型为宏容器
  3. 创建名为 _contactForm.cshtml 的局部视图(在 Views\MacroPartials 中)
  4. 使用 MVC 部分视图 _contactFrom.cshtml 创建了名为 Contact Form 的宏
  5. 添加了名为“联系我们”的联系表格类型的内容
  6. 在我的联系我们页面中将联系表单宏添加到名为 Body 的宏容器属性中

然后我有一个Surface Controller调用AJAX来显示页面(更具体地说是页面的 Body 属性):

public class JsController : SurfaceController
{
    public ActionResult GetPage(int id)
    {
        var page = new Node(id);

        if (page == null || page.GetProperty("body") == null)
            return Content(@"Hmm, something went wrong. Unable to find what you're looking for.");

        return Content(page.GetProperty("body").Value);
    }
}

这个设置几乎可以工作,但问题是返回的不是呈现的表单,而是:

<!--?UMBRACO_MACRO macroAlias="ContactForm" /-->

所以现在我需要渲染这个宏\表单\部分视图......我认为我可能需要在控制器中完成它,但如果我可以在另一边(通过 Javascript)完成它,那也可以。我可以在控制器中调用 Umbraco 函数来根据页面 ID 和宏别名呈现宏吗?

4

3 回答 3

5

因此,在花了几个小时对团队制作这个过程的愚蠢程度感到愤怒之后,阅读了这样这样Umbraco的线程,我终于想出了一个相当丑陋但工作的方式......如果类构造函数是,事情会简单得多不!PublishedContentRequestinternal

无论如何,这就是我必须做的:1)扩展EnsurePublishedContentRequestAttribute

public class CreatePublishedContentRequestAttribute
    : EnsurePublishedContentRequestAttribute
{
    public CreatePublishedContentRequestAttribute() : base(0) { }

    protected override void ConfigurePublishedContentRequest(
        PublishedContentRequest publishedContentRequest,
        ActionExecutedContext filterContext)
    {
        var contentId = filterContext.RouteData.Values["id"];
        int id = 0;

        if (contentId != null && int.TryParse(contentId.ToString(), out id))
        {
            var content = UmbracoContext.ContentCache.GetById(id);
            publishedContentRequest.PublishedContent = content;

            var defaultLanguage = Language.GetAllAsList().FirstOrDefault();
            publishedContentRequest.Culture = (defaultLanguage == null)
                ? CultureInfo.CurrentUICulture
                : new CultureInfo(defaultLanguage.CultureAlias);

            publishedContentRequest.ConfigureRequest();

            HttpContext.Current.Session["PublishedContentRequest"]
                = publishedContentRequest;
        }
    }
}

2) 重定向到使用此属性修饰的操作,该属性重定向回我的 GetPage 操作并PCRSession. 现在我们可以渲染我们的宏了:

public ActionResult GetPage(int id)
{
    var publishedContent = UmbracoContext.ContentCache.GetById(id);
    if (publishedContent == null || publishedContent.GetProperty("body") == null)
    { return Content(@"Unable to find what you're looking for."); }

    if (UmbracoContext.PublishedContentRequest == null
        && Session["PublishedContentRequest"] == null)
    { return RedirectToAction("CreatePublishedContentRequest", new { id }); }

    UmbracoContext.PublishedContentRequest =
        (PublishedContentRequest) Session["PublishedContentRequest"];
    Session["PublishedContentRequest"] = null;

    UmbracoContext.HttpContext.Items["pageID"] = id;

    return Content(GetHtmlContent(publishedContent));
}

[CreatePublishedContentRequest]
public ActionResult CreatePublishedContentRequest(int id)
{
    return RedirectToAction("GetPage", new { id });
}

private string GetHtmlContent(IPublishedContent publishedContent)
{
    string content = publishedContent.GetProperty("body").Value.ToString();
    if (string.IsNullOrEmpty(content) || !content.Contains("UMBRACO_MACRO"))
    { return content;}

    int startIndex = content.IndexOf("macroAlias=") + 12;
    int length = content.LastIndexOf('"') - startIndex;
    var macroAlias = content.Substring(startIndex, length);

    return (Umbraco.RenderMacro(macroAlias) ?? new HtmlString("")).ToString();
}

这行得通,但这是一些非常老套的东西。如果Umbraco团队制作了PublishedContentRequest构造函数public,这可能会更干净。当然,可能有更好的方法来做到这一点,如果是这样,我全神贯注。

于 2014-02-21T08:40:41.400 回答
0

不能使用 umbraco.library.RenderMacroContent 吗?

于 2015-07-27T18:54:00.120 回答
-3

您的控制器名称需要在其名称中包含“Surface”。

JsSurfaceController

此外,将 [HttpPost] 属性添加到 ActionResult 方法。

http://our.umbraco.org/documentation/Reference/Mvc/surface-controllers http://our.umbraco.org/documentation/Reference/Mvc/forms

于 2014-03-27T05:10:03.803 回答