【问题标题】:Umbraco AJAX partial view controller action call - unable to retrieve the Umbraco.ContextUmbraco AJAX 部分视图控制器操作调用 - 无法检索 Umbraco.Context
【发布时间】:2016-02-22 20:30:55
【问题描述】:

我有以下场景:日历页面加载了过去 2 个月的初始销售节点。此页面有一个 Load more 按钮,用于获取更多 Sale 商品,这些商品是另外 2 个月的Sales

我已经添加了对控制器操作的调用,如下所示:

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 列表,并在访问 Calendar 页面时使用 _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();
}

【问题讨论】:

    标签: jquery ajax asp.net-mvc umbraco umbraco7


    【解决方案1】:

    编辑:添加了固定实现。

    我可以通过在返回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 文件,字典值已正确加载。

    【讨论】:

      【解决方案2】:

      马尔科,

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

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

      伊斯梅尔

      【讨论】:

      • 感谢伊斯梅尔的回答。我刚刚尝试过,umbracoHelper 属性要么抛出异常,要么为空。还有什么我必须修改以确保加载正确的上下文吗?
      • 我也尝试过 AJAX 实现,但没有成功 - 请参阅底部的帖子编辑。
      • Ismail,我已经能够通过使用 CultureInfo 解决问题。看看我对这个问题的回答。
      猜你喜欢
      • 2014-03-27
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 2021-06-16
      相关资源
      最近更新 更多