[英]Call Action Method in controller on Ajax success function to Render partial view
[英]Umbraco AJAX partial view controller action call - unable to retrieve the Umbraco.Context
我有以下情形: 日歷頁面,加載最近兩個月的初始銷售節點。 此頁面上有一個“ 加載更多”按鈕,可以獲取更多的銷售商品,這是另外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")
有人遇到過類似的問題嗎?
編輯
我還嘗試了以下提交表單實現,但是結果是相同的:
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();
}
編輯 :添加了固定的實現。
我可以通過在返回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
文件,字典值已正確加載。
馬爾科,
這是在v6中,但類似的問題,所以在部分我
var umbracoHelper = new UmbracoHelper(UmbracoContext.Current); 問候
伊斯梅爾
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.