如何在没有页面类型引用的情况下在块 ajax 调用中获取 currentBlock。 [episerver 9]
How to get currentBlock in block ajax call without page type reference. [episerver 9]
在块 ajax 调用中获取 currentBlock 的最佳方法是什么?
[HttpGet]
public ActionResult GetSomething()
{
var currentBlock = Get(); //how?
return currentBlock.SomeLabel;
}
(不知道Block或者BlockController不知道Page的解决方法)
我想让块可重复用于任何页面。
谢谢。
为什么不添加路线呢?那么 URL 在使用该块的任何地方都是一样的吗?或者将操作放在所有页面控制器的基础 class 中。
然后你必须从你的块的视图中传递一个对动作的引用。
我认为您必须传递块的内容引用,但这还不错。
首先,请确保您的 global.asax
class 在 RegisterRoutes
方法的覆盖中包含标准 mvc 路由:
public class EPiServerApplication : EPiServer.Global
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
}
protected override void RegisterRoutes(RouteCollection routes)
{
base.RegisterRoutes(routes);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional });
}
}
我有一个块,我用它来测试一些东西;它有一个标题 属性 和项目 - 内容引用列表。
[ContentType(DisplayName = "Super Happy Fun Block", GUID = "b5d5c00c-dc8e-4ada-8319-20fd3474d4e7", Description = "")]
public class SuperHappyFunBlock : BlockData
{
public virtual string Title { get; set; }
public virtual IList<ContentReference> Items { get; set; }
}
对于这个块,我将创建一个包含这些属性和 ContentReference 属性 的视图模型。您可能可以在 cshtml 视图文件中执行此操作,但这会使您的视图更清晰一些。
public class SuperHappyFunModel
{
public string Title { get; set; }
public IList<ContentReference> Items { get; set; }
public ContentReference ContentLink { get; set; }
}
接下来,连接块的控制器以使用视图模型。我还需要一些 javascript 文件;这些可以通过控制器添加到这里。有关详细信息,请参阅 Client Resources 上的 Episerver 文档。
public class SuperHappyFunBlockController : BlockController<SuperHappyFunBlock>
{
public override ActionResult Index(SuperHappyFunBlock currentBlock)
{
ClientResources.RequireScript("https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.0.min.js").AtFooter();
ClientResources.RequireScript("/static/js/SuperHappyFunBlock.js").AtFooter();
var model = new SuperHappyFunModel
{
Title = currentBlock.Title,
Items = currentBlock.Items,
ContentLink = (currentBlock as IContent)?.ContentLink ?? ContentReference.EmptyReference
};
return PartialView(model);
}
}
在视图中,确保内容引用呈现在 javascript 可以找到的地方。我将使用名为 data-block-id
.
的数据属性
@model SuperHappyFunModel
<div class="SuperHappyFunBlockController" data-block-id="@Model.ContentLink.ToString()">
<p class="dynamic">Content goes here.</p>
</div>
块控制器中引用的 javascript 文件需要查找页面上的所有块实例,然后对每个块实例进行 ajax 调用。请记住,如果您的块在页面上用作 属性,那么它不会有 ContentLink
,因为块属性不会继承 IContent
.
(function($) {
$('.SuperHappyFunBlockController')
.each(function (index, blockDiv) {
var $blockDiv = $(blockDiv),
blockId = $blockDiv.attr('data-block-id');
if (!blockId) {
console.log('This block must be a property on a page... no block id found!');
return;
}
$.ajax({
method: 'GET',
url: '/superhappyfunblock/getsomething/' + blockId,
success: function (data) {
console.log(data);
$blockDiv.find('.dynamic').text(data);
}
});
console.log(blockId);
});
})($);
最后,要做的最后一件事是在控制器上创建 ajax 方法。这将需要一个名为 "id" 的字符串参数,以便它符合我们在开头添加的默认 MVC 视图。它还将在控制器上使用依赖注入来获取 IContentLoader
.
的实例
public class SuperHappyFunBlockController : BlockController<SuperHappyFunBlock>
{
public override ActionResult Index(SuperHappyFunBlock currentBlock)
{
// code omitted here for brevity...
}
private readonly IContentLoader _contentLoader;
public SuperHappyFunBlockController(IContentLoader contentLoader)
{
_contentLoader = contentLoader;
}
public ActionResult GetSomething(string id)
{
ContentReference blockReference;
if (!ContentReference.TryParse(id, out blockReference))
return HttpNotFound();
SuperHappyFunBlock block;
if (!_contentLoader.TryGet(blockReference, out block))
return HttpNotFound();
return Content($"This is some really cool stuff for the block named {((IContent) block).Name}.");
}
}
在块 ajax 调用中获取 currentBlock 的最佳方法是什么?
[HttpGet]
public ActionResult GetSomething()
{
var currentBlock = Get(); //how?
return currentBlock.SomeLabel;
}
(不知道Block或者BlockController不知道Page的解决方法)
我想让块可重复用于任何页面。
谢谢。
为什么不添加路线呢?那么 URL 在使用该块的任何地方都是一样的吗?或者将操作放在所有页面控制器的基础 class 中。 然后你必须从你的块的视图中传递一个对动作的引用。
我认为您必须传递块的内容引用,但这还不错。
首先,请确保您的 global.asax
class 在 RegisterRoutes
方法的覆盖中包含标准 mvc 路由:
public class EPiServerApplication : EPiServer.Global
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
}
protected override void RegisterRoutes(RouteCollection routes)
{
base.RegisterRoutes(routes);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional });
}
}
我有一个块,我用它来测试一些东西;它有一个标题 属性 和项目 - 内容引用列表。
[ContentType(DisplayName = "Super Happy Fun Block", GUID = "b5d5c00c-dc8e-4ada-8319-20fd3474d4e7", Description = "")]
public class SuperHappyFunBlock : BlockData
{
public virtual string Title { get; set; }
public virtual IList<ContentReference> Items { get; set; }
}
对于这个块,我将创建一个包含这些属性和 ContentReference 属性 的视图模型。您可能可以在 cshtml 视图文件中执行此操作,但这会使您的视图更清晰一些。
public class SuperHappyFunModel
{
public string Title { get; set; }
public IList<ContentReference> Items { get; set; }
public ContentReference ContentLink { get; set; }
}
接下来,连接块的控制器以使用视图模型。我还需要一些 javascript 文件;这些可以通过控制器添加到这里。有关详细信息,请参阅 Client Resources 上的 Episerver 文档。
public class SuperHappyFunBlockController : BlockController<SuperHappyFunBlock>
{
public override ActionResult Index(SuperHappyFunBlock currentBlock)
{
ClientResources.RequireScript("https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.0.min.js").AtFooter();
ClientResources.RequireScript("/static/js/SuperHappyFunBlock.js").AtFooter();
var model = new SuperHappyFunModel
{
Title = currentBlock.Title,
Items = currentBlock.Items,
ContentLink = (currentBlock as IContent)?.ContentLink ?? ContentReference.EmptyReference
};
return PartialView(model);
}
}
在视图中,确保内容引用呈现在 javascript 可以找到的地方。我将使用名为 data-block-id
.
@model SuperHappyFunModel
<div class="SuperHappyFunBlockController" data-block-id="@Model.ContentLink.ToString()">
<p class="dynamic">Content goes here.</p>
</div>
块控制器中引用的 javascript 文件需要查找页面上的所有块实例,然后对每个块实例进行 ajax 调用。请记住,如果您的块在页面上用作 属性,那么它不会有 ContentLink
,因为块属性不会继承 IContent
.
(function($) {
$('.SuperHappyFunBlockController')
.each(function (index, blockDiv) {
var $blockDiv = $(blockDiv),
blockId = $blockDiv.attr('data-block-id');
if (!blockId) {
console.log('This block must be a property on a page... no block id found!');
return;
}
$.ajax({
method: 'GET',
url: '/superhappyfunblock/getsomething/' + blockId,
success: function (data) {
console.log(data);
$blockDiv.find('.dynamic').text(data);
}
});
console.log(blockId);
});
})($);
最后,要做的最后一件事是在控制器上创建 ajax 方法。这将需要一个名为 "id" 的字符串参数,以便它符合我们在开头添加的默认 MVC 视图。它还将在控制器上使用依赖注入来获取 IContentLoader
.
public class SuperHappyFunBlockController : BlockController<SuperHappyFunBlock>
{
public override ActionResult Index(SuperHappyFunBlock currentBlock)
{
// code omitted here for brevity...
}
private readonly IContentLoader _contentLoader;
public SuperHappyFunBlockController(IContentLoader contentLoader)
{
_contentLoader = contentLoader;
}
public ActionResult GetSomething(string id)
{
ContentReference blockReference;
if (!ContentReference.TryParse(id, out blockReference))
return HttpNotFound();
SuperHappyFunBlock block;
if (!_contentLoader.TryGet(blockReference, out block))
return HttpNotFound();
return Content($"This is some really cool stuff for the block named {((IContent) block).Name}.");
}
}