Umbraco AJAX 部分视图控制器操作调用 - 无法检索 Umbraco.Context

Umbraco AJAX partial view controller action call - unable to retrieve the Umbraco.Context

我有以下情况:日历 页面加载了过去 2 个月的初始销售节点。此页面有一个 加载更多 按钮,可以获取更多 销售 项目,即额外 2 个月的 销售额

我已经像这样添加了对控制器操作的调用:

public ActionResult LoadMoreSales(int months = 0)
{
        if (Request.IsAjaxRequest())
        {
            if (Request.QueryString["department"] == null)
            {
                return PartialView("Calendar/_Sales", GetSales(0, months));
            }
            else
            {
                int depId = 0;
                Int32.TryParse(Request.QueryString["department"], out depId);

                return PartialView("Calendar/_Sales", GetSales(depId, months));
            }
        }
        else
        {
            return PartialView("Calendar/_Sales");
        }
}

GetSale 检索 SaleViewModel 的列表,并且在访问时使用 _Sales 部分日历 页面和单击 加载更多 按钮时。通过此方法,将进行 AJAX 调用并检索列表。

_Sales 部分继承了以下内容:

@inherits Umbraco.Web.Mvc.UmbracoViewPage<IEnumerable<SaleViewModel>>

点击按钮jQuery事件:

$('.js-reload-details').on('click', function (evt) {
    $('div#loading').html('<img src="/images/ajax-loader.gif" />');
    evt.preventDefault();
    evt.stopPropagation();

    var $detailsDiv = $('#detailsDiv'),
        url = $(this).data('url');

    $.get(url, function (data) {
        $detailsDiv.replaceWith(data);
    });

    $('div#loading').empty();
});

按钮点击是这样实现的:

<a id="loadMore" class="js-reload-details cta" data-url="@Url.Action("LoadMoreSales", "Calendar", new { months = -2})" href="javascript:;">@Umbraco.GetDictionaryValue("Calendar.LoadMore")</a>

正在加载 Sale 项目,但我无法访问 UmbracoHelper 并且当我将宏添加到销售页面列表时字段,调用中断,因为没有 UmbracoContext 引用。此外,以下字典调用不起作用:

@umbracoHelper.GetDictionaryValue("Calendar.ViewDetails")

有人遇到过类似的问题吗?

Related our.umbraco forum post

编辑

我也试过下面的提交表单实现,但是结果是一样的:

AJAX形式:

@using (Ajax.BeginForm("LoadMoreSales", 
                       "Calendar",  
                       new {months = -2}, 
                       new AjaxOption { HttpMethod = "GET", 
                                        OnSuccess = "loadMore(data, status, xhr)" }))

jQuery 实施:

function loadMore(data, status, xhr) {
        $('div#loading').html('<img src="/images/ajax-loader.gif" />');

        if (data != '') {
            $("#saleList").append(data);
        }

        $('div#loading').empty();
}

马尔科,

这是在 v6 中但类似的问题,所以在部分我做到了

var umbracoHelper = new UmbracoHelper(UmbracoContext.Current); 问候

伊斯梅尔

编辑:添加固定实现。

我能够通过在返回 PartialView 之前设置 CultureInfo 来解决问题,如下所示:System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture)

操作方法如下所示:

public ActionResult LoadMoreSales(int months = 0, string culture = "")
{
        // Set the 'CultureInfo' to perserve 'UmbracoContext' when performing an AJAX call
        System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);

        if (Request.IsAjaxRequest())
        {
            if (Request.QueryString["department"] == null)
            {
                return PartialView("Calendar/_Sales", GetSales(0, months));
            }
            else
            {
                int depId = 0;
                Int32.TryParse(Request.QueryString["department"], out depId);

                return PartialView("Calendar/_Sales", GetSales(depId, months));
            }
        }
        else
        {
            return PartialView("Calendar/_Sales");
        }
}

我在 .cshtml:

添加了隐藏的 cultureInfo 标签
<div id="cultureInfo" hidden>@System.Threading.Thread.CurrentThread.CurrentCulture</div>

jQuery 也被修改为读取隐藏值并将其传递给控制器​​操作,如下所示:

        var cultureInfo = $('#cultureInfo').html();

        $.get("/umbraco/surface/Calendar/LoadMoreSales?months=" + months + "&culture=" + cultureInfo, function (data) {
            if (data != '') {
                $("#saleList").append(data);
            }
            else {
                months = -1;
                $("#saleList").append('No more news to display');
            }

            _inCallback = false;
            $('div#loading').empty();
        });

无需更改 .cshtml 文件,正在正确加载字典值。