2012-11-05 7 views
5

Ich habe einen Inhaltsteil erstellt und fügen Sie es zum Inhaltstyp. Wenn ich einen Inhaltstyp erstelle, wird im Gegensatz zu anderen Feldern kein Inhaltsteil angezeigt. Nein, Kompilierung oder protokollierte Fehler, Inhalt wurde zu placement.info hinzugefügt.Orchard CMS: Inhalt Teil nicht angezeigt

Driver:

[UsedImplicitly] 
public class TradeItemPartDriver: ContentPartDriver<TradeItemPart> 
{ 
    private readonly ITradeItemService _tradeItemService; 

    private const string TemplateName = "Parts/TradeItem"; 

    public TradeItemPartDriver(ITradeItemService tradeItemService) 
    { 
     _tradeItemService = tradeItemService; 
    } 

    protected override string Prefix 
    { 
     get { return "TradeItem"; } 
    } 

    protected override DriverResult Display(
     TradeItemPart part, 
     string displayType, 
     dynamic shapeHelper) 
    { 

     return ContentShape("Parts_TradeItem", 
         () => shapeHelper.Parts_TradeItem(
          ContentPart: part)); 
    } 

    protected override DriverResult Editor(
     TradeItemPart part, 
     dynamic shapeHelper) 
    { 
     var shape = ContentShape("Parts_TradeItem_Edit", 
       () => shapeHelper.EditorTemplate(
        TemplateName: TemplateName, 
        Model: BuildEditorViewModel(part), 
        Prefix: Prefix)); 
     return shape; 
    } 

    protected override DriverResult Editor(
     TradeItemPart part, 
     IUpdateModel updater, 
     dynamic shapeHelper) 
    { 

     var model = new EditTradeItemViewModel(); 
     updater.TryUpdateModel(model, Prefix, null, null); 

     if (part.ContentItem.Id != 0) 
     { 
      _tradeItemService.UpdateTradeItemForContentItem(
       part.ContentItem, model); 
     } 

     return Editor(part, shapeHelper); 
    } 

    private EditTradeItemViewModel BuildEditorViewModel(TradeItemPart part) 
    { 
     var model = new EditTradeItemViewModel 
     { 
Code = part.Code, Cost= part.Cost, Unit = part.Unit, Weight = part.Weight, 
UnitsList = _tradeItemService.GetUnitTypes() 
     }; 
     return model; 
    } 
} 

Handler:

public class TradeItemPartHandler : ContentHandler 
{ 
    public TradeItemPartHandler(IRepository<TradeItemPartRecord> repository) 
    { 
     Filters.Add(StorageFilter.For(repository)); 
    } 
} 

Modelle:

public enum EnumTradeItemUnit : byte 
{ 
    Шт = 0, 
    Кг = 1, 
    Литр = 2, 
    Упаковка = 3 
} 

public class TradeItemPartRecord : ContentPartRecord 
{ 
    public virtual string Code { get; set; } 
    public virtual decimal Weight { get; set; } 
    public virtual decimal Cost { get; set; } 
    public virtual int Unit { get; set; } 
} 

public class TradeItemPart : ContentPart<TradeItemPartRecord> 
{ 
    public virtual string Code { get; set; } 
    public virtual decimal Weight { get; set; } 
    public virtual decimal Cost { get; set; } 
    public virtual EnumTradeItemUnit Unit { get; set; } 
} 

Serveces:

public interface ITradeItemService: IDependency 
{ 
    //IEnumerable<TradeItemPart> GetTradeItems(); 
    SelectList GetUnitTypes(); 
    void UpdateTradeItemForContentItem(
     ContentItem item, 
     EditTradeItemViewModel model); 
} 

public class TradeItemService : ITradeItemService 
{ 
    private readonly IContentManager _contentManager; 
    private readonly IRepository<TradeItemPartRecord> _tradeItemsRepository; 

    public TradeItemService(IContentManager contentManager, IRepository<TradeItemPartRecord> tradeItemsRepository) 
    { 
     _contentManager = contentManager; 
     _tradeItemsRepository = tradeItemsRepository; 
    } 

    public SelectList GetUnitTypes() 
    { 
     return new SelectList(
     Enum.GetValues(typeof(EnumTradeItemUnit)).Cast<EnumTradeItemUnit>().Select 
      (it => 
      new SelectListItem() { Value = ((byte)it).ToString(), Text = it.ToString() })); 
    } 

    public void UpdateTradeItemForContentItem(
     ContentItem item, 
     EditTradeItemViewModel model) 
    { 
     var part = item.As<TradeItemPart>(); 
     part.Code = model.Code; 
     part.Cost = model.Cost; 
     part.Unit = model.Unit; 
     part.Weight = model.Weight; 
    } 
} 

Viewmodel:

public class EditTradeItemViewModel 
{ 
    [StringLength(10), WebDisplayName("Код")] 
    public virtual string Code { get; set; } 
    [Required, Range(0, 100, ErrorMessage = "Товары тяжелее 100кг пусть более крутые ребята возят"), WebDisplayName("Вес")] 
    public virtual decimal Weight { get; set; } 
    [Required, Range(0.01, 100000, ErrorMessage = "Товары дороже 100тыс.р. пусть более крутые ребята возят"), WebDisplayName("Цена")] 
    public virtual decimal Cost { get; set; } 
    [Required, WebDisplayName("Единица измерения")] 
    public virtual EnumTradeItemUnit Unit { get; set; } 
    public virtual SelectList UnitsList { get; set; } 
} 

~/Views/EditorTemplates/Teile/TradeItem.cshtml

@model Delivery.ViewModels.EditTradeItemViewModel 
<fieldset> 
    <legend>@T("Характеристики")</legend> 

    <div class="editor-label"> 
    @Html.LabelFor(model => model.Code, T("Код")) 
    </div> 
    <div class="editor-field"> 
    @Html.TextBoxFor(model => model.Code) 
    @Html.ValidationMessageFor(model => model.Code) 
    </div> 

    <div class="editor-label"> 
    @Html.LabelFor(model => model.Unit, T("Единица измерения")) 
    </div> 
    <div class="editor-field"> 
    @Html.DropDownListFor(model => model.Unit, Model.UnitsList) 
    @Html.ValidationMessageFor(model => model.Unit) 
    </div> 

    <div class="editor-label"> 
    @Html.LabelFor(model => model.Cost, T("Стоимость")) 
    </div> 
    <div class="editor-field"> 
    @Html.TextBoxFor(model => model.Cost) 
    @Html.ValidationMessageFor(model => model.Cost) 
    </div> 

    <div class="editor-label"> 
    @Html.LabelFor(model => model.Weight, T("Вес одной единицы")) 
    </div> 
    <div class="editor-field"> 
    @Html.TextBoxFor(model => model.Weight) 
    @Html.ValidationMessageFor(model => model.Weight) 
    </div> 

</fieldset> 

Platzierung:

<Placement> 
    <Place Parts_TradeItem_Edit="Content:10"/> 
    <Place Parts_TradeItem="Content:10"/> 
</Placement> 

Migrationen:

 SchemaBuilder.CreateTable("TradeItemRecord", 
         table => table 
          .ContentPartRecord() 
          .Column<string>("Code", column => column.WithLength(10)) 
          .Column<decimal>("Weight", column => column.WithPrecision(8).WithScale(2)) 
          .Column<decimal>("Cost", column => column.WithPrecision(8).WithScale(2)) 
          .Column<byte>("Unit") 
         ); 

     ContentDefinitionManager.AlterPartDefinition("TradeItem", 
      builder => builder.Attachable()); 
+2

Haben Sie die Funktion aktiviert? –

Antwort

12

Es gibt im Allgemeinen 2 Probleme mit deinem Code.

Zuerst haben Sie bei Ihren Migrationen den Teil TradeItem aufgerufen, während Sie im Modell TradeItemPart genannt haben. Das Ändern des einen oder anderen löst das Problem, warum nichts im Editor erscheint.

Das führt uns zu dem zweiten Problem, das das Speichern Ihrer Daten deaktiviert. Sie haben Ihre TradeItemPart nicht mit Ihrer TradeItemPartRecord verbunden. Um dieses Problem zu lösen, müssen Sie TradeItemPart anzupassen, so dass es wie folgt aussieht:

public class TradeItemPart : ContentPart<TradeItemPartRecord> 
{ 
    public string Code { 
     get { return Record.Code; } 
     set { Record.Code = value; } 
    } 
    public decimal Weight { 
     get { return Record.Weight; } 
     set { Record.Weight = value; } 
    } 
    public decimal Cost { 
     get { return Record.Cost; } 
     set { Record.Cost = value; } 
    } 
    public EnumTradeItemUnit Unit { 
     get { return (EnumTradeItemUnit)Record.Unit; } 
     set { Record.Unit = (int)value; } 
    } 
} 

Ich bin auch nicht sicher, ob Orchard korrekt Spalt des Typs assoziiert byte zum int Typ. Wenn die oben genannten Änderungen nicht funktionieren, ändern Sie den Spaltentyp Unit Spalte in int.

+1

Ja, es funktioniert! Danke, Freund, vielen Dank! PS: OMG, eine Menge Fehler ... Wo war mein Kopf? – Blush

+1

Leider reicht mein Ruf für eine Abstimmung immer noch nicht aus :( Aber natürlich werde ich gleich nach Erreichen des gewünschten Rufes abstimmen :) – Blush

+0

Kein Problem, aber ich denke du kannst die Antwort trotzdem als akzeptiert markieren. Es sieht aus wie ein Häkchen direkt unter dem Ergebnis der Antwort. Du bekommst auch +2 Ansehen, indem du die Antwort akzeptierst;) –

Verwandte Themen