虚拟属性readonly - 无法更改其值

时间:2016-05-03 13:29:13

标签: c# properties readonly episerver

我试图动态地将DB中的值分配给继承自EpiServer PageData类的属性。这就是我的意思:

namespace Episerver9.Models.Pages
{
    [ContentType]
    public class StartPage : PageData
    {
        public virtual string Username { get; set; }
        public virtual string Password { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }

        [ReadOnly(false)]
        [Editable(true)]
        public virtual string testfield { get; set; }


    }
}

在控制器中我尝试以下方法:

namespace Episerver9.Controllers
{
    public class StartPageController : PageController<StartPage>
    {
        // GET: StartPage

        public ActionResult Index(StartPage currentPage)
        {
            currentPage.testfield = "test";
            return View(currentPage);
        }
    }
}

这就是我试图在视图中显示的内容:

@Html.PropertyFor(x=>x.testfield)
// Trying to dynamically populate the data from code, later on from DB

我得到的错误是:

Additional information: The property testfield is read-only

即使我明确指出该资产不是只读的,也会发生这种情况......有谁知道为什么?

1 个答案:

答案 0 :(得分:6)

这是因为 ContentData 对象始终是只读的,以达到性能目的。要更改任何属性,您必须创建可写克隆,如:

currentPage.CreateWritableClone()

这将为您提供可以更改的页面实例,例如使用 IContentRepository 实例保存更改。

但请注意,由于某种原因,这些实例是只读的。 :)最好创建一个传递给视图的单独视图模型。