如何通过Orchard模块保存数据?

时间:2011-08-11 09:30:55

标签: orchardcms

我是果园里的新人。

要学习果园模块开发,我正在关注文档以尝试创建商业模块。

该模块由产品部件和产品类型组成,其中包含产品部件。

当我尝试使用以下方法保存数据时:

public ActionResult Create(FormCollection input)
    {
        var product = contentManager.New<ProductPart>("Product");
        product.Description = input["Description"];
        product.Sku = input["Sku"];
        product.Price =Convert.ToDecimal(input["Price"]);

        if (!ModelState.IsValid)
        {
            return View(product);
        }

        contentManager.Create(product);

        return RedirectToAction("Index");
    }    

我收到一条错误,指出特定的广告素材无效且part(ContentPart)为空。

public static T New<T>(this IContentManager manager, string contentType)
 where T : class, IContent {
        var contentItem = manager.New(contentType);
        if (contentItem == null)
            return null;

        var part = contentItem.Get<T>();
        if (part == null)
            throw new InvalidCastException();

        return part;
    }

我使用了内容类型Product,我有ProductRecord类用于存储数据,如下所示:

public class ProductRecord:ContentPartRecord
{
   // public virtual int Id { get; set; }


    public virtual string Sku { get; set; }


    public virtual string Description { get; set; }


    public virtual decimal Price { get; set; }


}



public class ProductPart : ContentPart<ProductRecord>
{
    /*
    public int Id
    {
        get { return Record.Id; }
        set{Record.Id = value;}
    }
    */

    [Required]
    public  string Sku
    {
        get { return Record.Sku; }
        set { Record.Sku = value; }
    }

    [Required]
    public  string Description 
    {
        get { return Record.Description; }
        set{ Record.Description = value;}
    }

    [Required]
    public  decimal Price 
    {
        get { return Record.Price; }
        set { Record.Price = value; }
    }


}

有谁能告诉我我的问题是什么?

3 个答案:

答案 0 :(得分:2)

我只是在猜测,但您是否在migration.cs中声明了您的记录和ContentType?如果不这样做,内容管理将无法使用您的类型创建内容项,因为它不知道相关类型。

您的migration.cs看起来应该是这样的:

public class Migrations : DataMigrationImpl
{

    public int Create()
    {
        SchemaBuilder.CreateTable("ProductRecord",
            table =>
            {
                table.ContentPartRecord()
                     .Column<string>("Sku")
                     .Column<string>("Description")
                     .column<decimal>("Price");
            });            

        ContentDefinitionManager.AlterTypeDefinition("Product", cfg => cfg.WithPart("ProductPart"));

        return 1;
    }
}

另一方面,Orchard中的命名约定是为部分XXXPartRecord命名记录。我不认为你的问题就在那里。

答案 1 :(得分:1)

您可以尝试使用pszmyd的命令行实用程序生成类似的部件,看看有什么不同。

http://www.szmyd.com.pl/blog/generating-orchard-content-parts-via-command-line

答案 2 :(得分:1)

我已经在你的其他帖子中提到了这个.. Orchard Content Type is null

你需要

  1. 迁移

    public class Migrations:DataMigrationImpl {

    public int Create() {
        SchemaBuilder.CreateTable("ProductRecord",
            table => table
                .ContentPartRecord()
                .COLUMNS NEED TO BE SPECIFIED
            );
    
        ContentDefinitionManager.AlterTypeDefinition("Forum",
            cfg => cfg
                .WithPart("ProductPart")
                .WithPart("CommonPart")
            );
    
  2. 存储库

    公共类ProductPartHandler:ContentHandler {     public ProductPartHandler(IRepository repository){         Filters.Add(StorageFilter.For(储存库));     }

  3. 希望这有帮助