Umbraco 4.11模型和模板继承

时间:2012-12-21 16:47:22

标签: asp.net-mvc razor umbraco

我是Umbraco和MVC的新手 - 有人可以帮助解决以下问题吗?

我有一个主模板(Root.cshtml),它下面嵌有模板。在其中一些我想使用自定义模型,但Root.cshtml需要访问Umbraco助手。

因此,嵌套页面继承自Umbraco.Web.Mvc.UmbracoViewPage< CustomModel >,而Root.cshtml需要从更通用的东西继承。

我试过让我的自定义模型继承自Umbraco.Web.Models.RenderModel但是我一直被告知我的自定义模型不包含带0参数的构造函数,或者,如果我给它一个,那么' Umbraco.Web.Models.RenderModel'不包含带0参数的构造函数

我做错了什么,我应该如何完成这种嵌套?

namespace CRuMbraco.Web.Models {
public class RegisterModel : RenderModel {
    [Required]
    [Display(Name = "Customer code")]
    public string CustomerCode { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    [DataType(DataType.EmailAddress)]
    [Display(Name = "Confirm email")]
    [Compare("Password", ErrorMessage = "The e-mail and confirmation e-mail do not match.")]
    public string ConfirmEmail { get; set; }

    [Required]
    [Display(Name = "FirstName")]
    public string FirstName { get; set; }

    [Required]
    [Display(Name = "LastName")]
    public string LastName { get; set; }
}

}

2 个答案:

答案 0 :(得分:2)

使用主模板的所有视图都应来自@inherit {。}}。{/ p>

UmbracoTemplatePage实际上继承自UmbracoTemplatePage,还有两个额外的属性Umbraco.Web.Mvc.UmbracoViewPage<RenderModel>CurrentPage,后者就像你说的是Umbraco类的一个实例。

我很确定你不能用自定义模型替换它,因为模型的实例是由Umbraco路由决定的。

但是,如果您希望视图具有自定义模型,则应该使用子操作。这些允许您将自定义对象独立于UmbracoHelper传递到页面中。如果您希望在所有页面/视图中都可以使用某些内容,无论它们是视图,部分视图还是子操作,您都可以创建一个全局过滤器,例如从会话中将数据设置到Viewbag。

这里有一些文档可以帮助您了解the Umbraco MVC basics

答案 1 :(得分:0)

实际上你可以像这样使用UmbracoViewPage:

Umbraco.Web.Mvc.UmbracoViewPage<RegisterModel>

为此,您的自定义模型需要扩展RenderModel,例如:

public class RegisterModel: RenderModel 
{
    public RegisterModel(IPublishedContent content, CultureInfo culture)
        : base(content, culture)
    {
    }
    // my properties here
}

您可以通过高举路线来实例化自定义模型,请参阅:http://our.umbraco.org/documentation/Reference/Mvc/custom-controllers

所以,你最终会得到类似的东西:

public class HomeController : Umbraco.Web.Mvc.RenderMvcController
{
    public override ActionResult Index(RenderModel model)
    {
        var customUmbracoModel = new RegisterModel(model.Content, model.CurrentCulture);

        // do some extra form stuff here

        return base.Index(customUmbracoModel );
    }
}