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
文件,正在正确加载字典值。
我有以下情况:日历 页面加载了过去 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
文件,正在正确加载字典值。