一尘不染

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

ajax

我有以下情况: 日历 页面,加载最近两个月的初始销售节点。这个页面有一个 加载更多 的按钮,取更多的 销售 是额外的2个月项目 销售

我已将调用添加到to控制器操作中,如下所示:

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>

项目被加载,但我无法访问 UmbracoHelper ,当我加入宏来销售页面场列表,通话中断,因为没有 UmbracoContext
参考。另外,以下字典调用不起作用:

@umbracoHelper.GetDictionaryValue("Calendar.ViewDetails")

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

相关our.umbraco论坛帖子

编辑

我也尝试了以下提交表单实现,但是结果是相同的:

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();
}

阅读 233

收藏
2020-07-26

共1个答案

一尘不染

编辑 :添加了固定的实现。

我能够通过CultureInfo在返回之前设置来解决此问题,PartialView如下所示: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");
        }
}

我在中添加了隐藏cultureInfo标签.cshtml

<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文件,字典值已正确加载。

2020-07-26