2
votes

i am new in orchard module development.i create a module.when i try to save data. i use this code fore save data

    public ActionResult Create(FormCollection input)
    {
        var product = contentManager.New<ProductPart>("Product");
        product.EmployeeName = input["EmployeeName"];
        product.EmployeeFathersName = input["EmployeeFathersName"];
        product.DOB = Convert.ToDateTime(input["DOB"]);
        product.Email = input["Email"];
        product.Address = input["Address"];
        product.JoiningDate = Convert.ToDateTime(input["JoiningDate"]);

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

        contentManager.Create(product);

        return RedirectToAction("Index");
    }

this class i use in Model

public class ProductRecord:ContentPartRecord
{
    public virtual string EmployeeName { get; set; }

    public virtual string EmployeeFathersName { get; set; }
    public virtual DateTime DOB { get; set; }
    public virtual string Email { get; set; }
    public virtual string Address { get; set; }
    public virtual DateTime JoiningDate { get; set; }
}

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

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

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

    [Required]
    public DateTime DOB
    {
        get { return Record.DOB; }
        set { Record.DOB = value; }
    }
    [Required]
    public string Email 
    {
        get { return Record.Email; }
        set { Record.Email = value; }
    }
    [Required]
    public string Address 
    {
        get { return Record.Address; }
        set { Record.Address = value; }
    }
    [Required]
    public DateTime JoiningDate 
    {
        get { return Record.JoiningDate;}
        set { Record.JoiningDate = value; }
     }

}

i use content type "Product" but when it goes orchard ContentCreateExtension in belows method

   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;
    }

here i face var part is null that means it content part is null.
please help me....

3

3 Answers

4
votes

Have you setup your migrations class?

i.e.

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")
            );

Also have you setup your repository?

i.e.

public class ProductPartHandler : ContentHandler {
    public ProductPartHandler(IRepository<ProductPartRecord> repository) {
        Filters.Add(StorageFilter.For(repository));
    }
4
votes

In addition to the Nicholas answer, I want to mention, that missing driver for the ProductPart can cause such error. Make sure, that you have at least empty driver defined.

public class ProductPartDriver : ContentPartDriver<ProductPart> {}
2
votes

Just went through a similar situation, be sure that the handler class is declared as public.