Episerver以编程方式创建页面

时间:2017-11-02 13:39:40

标签: episerver

我正在使用此代码

        var parent = ContentReference.StartPage;
        IContentRepository contentRepository = EPiServer.ServiceLocation.ServiceLocator.Current.GetInstance<IContentRepository>();

        PageData myPage = contentRepository.GetDefault<LoginPage>(parent);
        myPage.PageName = "My new page";

        var page = contentRepository.GetChildren<LoginPage>(parent).FirstOrDefault(name => name.Name == myPage.Name);

        if (page == null)
            contentRepository.Save(myPage, EPiServer.DataAccess.SaveAction.Publish);

以编程方式创建页面。问题是我不知道在哪里放这个代码?

我不想在admin / edit面板的列表中显示要显示的页面类型的LoginPage,因为我想在该页面类型下只创建一个页面。也许还有另一种方法,我可以创建一个独立的页面,而不必创建页面类型或可能使用已经制作的页面类型。

这是我的页面类型的代码

[ContentType(DisplayName = "Custom Login Page", GUID = "c0d358c3-4789-4e53-bef3-6ce20efecaeb", Description = "")]
public class LoginPage : StandardPage
{
    /*
            [CultureSpecific]
            [Display(
                Name = "Main body",
                Description = "The main body will be shown in the main content area of the page, using the XHTML-editor you can insert for example text, images and tables.",
                GroupName = SystemTabNames.Content,
                Order = 1)]
            public virtual XhtmlString MainBody { get; set; }
     */
}

然后我正在创建一个这样的模型

public class LoginModel : PageViewModel<LoginPage>
{
    public LoginFormPostbackData LoginPostbackData { get; set; } = new LoginFormPostbackData();
    public LoginModel(LoginPage currentPage)
        : base(currentPage)
    {
    }
    public string Message { get; set; }
}

public class LoginFormPostbackData
{
    public string Username { get; set; }
    public string Password { get; set; }
    public bool RememberMe { get; set; }
    public string ReturnUrl { get; set; }
}

我的控制器看起来像这样

    public ActionResult Index(LoginPage currentPage, [FromUri]string ReturnUrl)
    {

        var model = new LoginModel(currentPage);
        model.LoginPostbackData.ReturnUrl = ReturnUrl;
        return View(model);
    }

您认为还有其他办法吗?我还将显示我的登录视图

@using EPiServer.Globalization
@model LoginModel

<h1 @Html.EditAttributes(x => 
x.CurrentPage.PageName)>@Model.CurrentPage.PageName</h1>
<p class="introduction" @Html.EditAttributes(x => 
x.CurrentPage.MetaDescription)>@Model.CurrentPage.MetaDescription</p>
<div class="row">
<div class="span8 clearfix" @Html.EditAttributes(x => 
x.CurrentPage.MainBody)>
    @Html.DisplayFor(m => m.CurrentPage.MainBody)

</div>

@if (!User.Identity.IsAuthenticated && 
!User.IsInRole("rystadEnergyCustomer"))
{
<div class="row">
    @using (Html.BeginForm("Post", null, new { language = ContentLanguage.PreferredCulture.Name }))
    {
        <div class="logo"></div>
        @Html.AntiForgeryToken()

        <h2 class="form-signin-heading">Log in</h2>
        @Html.LabelFor(m => m.LoginPostbackData.Username, new { @class = "sr-only" })
        @Html.TextBoxFor(m => m.LoginPostbackData.Username, new { @class = "form-control", autofocus = "autofocus" })

        @Html.LabelFor(m => m.LoginPostbackData.Password, new { @class = "sr-only" })
        @Html.PasswordFor(m => m.LoginPostbackData.Password, new { @class = "form-control" })
        <div class="checkbox">
            <label>
                @Html.CheckBoxFor(m => m.LoginPostbackData.RememberMe)
                @Html.DisplayNameFor(m => m.LoginPostbackData.RememberMe)
            </label>
        </div>

        @Html.HiddenFor(m => m.LoginPostbackData.ReturnUrl, "/login-customers")
        <input type="submit" value="Log in" class="btn btn-lg btn-primary btn-block" />
    }
    @Html.DisplayFor(m => m.Message)
</div>
}
else
{
<span>Welcome @User.Identity.Name</span>
@Html.ActionLink("Logout", "Logout", "LoginPage", null, null);
}

1 个答案:

答案 0 :(得分:2)

我认为你误解了一些Episerver概念。

如果您不希望它成为Episerver中的页面,则不应使用PageController,页面类型或模板。相反,只需使用标准控制器和视图即可创建登录页面。

否则,您必须创建类型为LoginPage的页面,该页面将显示在页面树中。无需以编程方式创建,您只需手动添加页面,然后从编辑模式隐藏LoginPage类型,以避免编辑者创建其他登录页面。