2013-12-17 2 views
0

Мне нужно создать элемент контента с помощью кода. Я знаю, что есть встроенный способ, но я хочу, чтобы мои собственные функции в модуле. Я пробовал код, но это дает мне ошибку. Все связанные коды приведены ниже. Название части содержимого - «Course», а Content Item name - «Курсы»Создание элемента контента через код в Orchard CMS

«Ссылка на объект не установлена ​​в экземпляр объекта».

[HiddenInput(DisplayValue = false)] 
public int Id { 
get { return ContentItem.Id; } 
} 

**Controller** 

    public ActionResult Create() 
    {    
     var course = _orchardService.ContentManager.New("Courses"); 
     dynamic model = _orchardService.ContentManager.BuildEditor(course); 

     return View((object)model);         
    } 


    [HttpPost, ActionName("Create")] 
    public ActionResult CreatePOST(string idl) 
    { 

     var contentItem = _contentManager.New("Courses"); 

     _contentManager.Create(contentItem, VersionOptions.Draft); 

     dynamic model = _contentManager.UpdateEditor(contentItem, this); 

     _contentManager.Publish(contentItem); 

     _orchardService.Notifier.Information(new LocalizedString("Your content has been created.")); 

     var adminRouteValues = _contentManager.GetItemMetadata(contentItem).AdminRouteValues; 

     return RedirectToRoute(adminRouteValues); 
    } 


    public ActionResult Index(PagerParameters pagerParameters, CourseSearchVM search) 
    { 
     //this is displaying only published content 
     var courseQuery = _contentManager.Query<CoursePart>().List().ToList(); 
     // Project the query into a list of customer shapes 
     var coursesProjection = from course in courseQuery 
            select Shape.course 
            (
            Id: course.Id, 
            Name: course.Name, 
            Description: course.Description 
           ); 

     // The pager is used to apply paging on the query and to create a PagerShape 
     var pager = new Pager(_siteService.GetSiteSettings(), pagerParameters.Page, pagerParameters.PageSize); 
     // Apply paging 
     var coures = coursesProjection.Skip(pager.GetStartIndex()).Take(pager.PageSize); 
     // Construct a Pager shape 
     var pagerShape = Shape.Pager(pager).TotalItemCount(courseQuery.Count()); 
     // Create the viewmodel 
     var model = new CourseIndexVM(coures, search, pagerShape); 
     return View(model); 
    } 


**CoursePart Model** 

public class CoursePart : ContentPart<CoursePartRecord> 
{ 
    public string Name 
    { 
     get { return Record.Name; } 
     set { Record.Name = value; } 
    } 

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

public class CoursePartRecord : ContentPartRecord 
{ 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 


**Create.cshtml** 

@{ Layout.Title = "Edit Course"; } 

@using(Html.BeginFormAntiForgeryPost()) 
{ 
@Display(Model) 
} 

**Course.cshtml** 

@model Course.Models.CoursePart 
<fieldset> 
<div class="editor-label">@Html.LabelFor(x => x.Name)</div> 
<div class="editor-field"> 
    @Html.EditorFor(x => x.Name) 
    @Html.ValidationMessageFor(x => x.Name) 
</div> 

<div class="editor-label">@Html.LabelFor(x => x.Description)</div> 
<div class="editor-field"> 
    @Html.EditorFor(x => x.Description) 
    @Html.ValidationMessageFor(x => x.Description) 
</div> 
</fieldset> 
+1

Вы пробовали отлаживать, чтобы увидеть, на какую строку набрасывается исключение? Я думаю, что .As <>() возвращает значение null, если элемент содержимого не содержит часть содержимого, которую вы пытаетесь выполнить, что приведет к исключению NullReferenceException при попытке установить имя и описание, поэтому проверьте, не указан ли тип содержимого есть эта часть. – mdm

ответ

0

Вы пытаетесь внедрить ContentItem в ContentPart. Это не сработает, вместо этого в вашем действии createPost вы должны вызвать метод contentManger.UpdateEditor. Для этого вам необходимо реализовать интерфейс IUpdateModel. Взгляните на AdminController на Orchard.Core/Contents/Controller.

В этот уик-энд я выпущу модуль, который позволяет настраивать редакторы на передней панели.

+0

Я точно сделал то, что вы сказали, но по-прежнему получает ту же ошибку. странно, что я скопировал тот же код, который используется для создания контента в саду. Я изменил свое оригинальное сообщение для справки. –

+0

Спасибо за помощь, ее работа сейчас. я просто изменил параметр на (string id) –

0

Как упоминалось в комментарии, это помогло бы узнать, на какой строке вы указали ошибку и какой элемент был пустым.

Это, как говорится, чтобы ответить на ваш первый вопрос, как создать элемент контента из вашего кода:

var item = _orchardServices.ContentManager.New("Course"); 
var part = item.As<CoursePart>(); 
part.Name = "SomeName"; 
part.Description = "SomeDescription"; 
_orchardServices.ContentManager.Create(item); 

Однако, как заявил jmgomez вы обычно не должны делать это. Я хотел бы предложить вам прочитать эту часть документации: http://docs.orchardproject.net/Documentation/Writing-a-content-part

и, возможно, взглянуть на этот учебник: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1

Для помощи пейджера, вы можете захотеть взглянуть на это: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-10

Смежные вопросы