2012-11-05 79 views
5

我創建了內容部分,並將其添加到內容類型。 當我創建內容類型時,不像其他字段那樣顯示內容部分。 沒有編譯或記錄錯誤,內容部分已添加到placement.info。Orchard CMS:內容部分未顯示

司機:

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

處理程序:

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

型號:

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

個視圖模型:

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

〜/查看/ EditorTemplates /零件/ 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> 

放置:

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

遷移:

 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

您是否啓用了該功能? –

回答

12

通常有2您的代碼存在問題。

首先,在您的遷移中,您在模型中調用了部分TradeItem,因此稱其爲TradeItemPart。改變一個或另一個將解決編輯器中爲什麼沒有顯示的問題。

這導致我們遇到第二個問題,它將禁用保存您的任何數據。您沒有將您的TradeItemPart與您的TradeItemPartRecord連接起來。爲了解決這個問題,你需要調整TradeItemPart,使它看起來像這樣:

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

我也不能肯定是否果園將會正確byte類型的列到int類型相關聯。如果上述更改不起作用,請嘗試將列類型Unit列更改爲int

+1

是的,它的工作原理!感謝你,朋友,感謝很多! PS:OMG,很多錯誤...我的頭在哪裏? – Blush

+1

不幸的是,我的聲望仍然不足以進行投票:( 但當然我會在達到所需聲望後立即投票:) – Blush

+0

沒問題,但我認爲你仍然可以將答案標記爲已接受的答案。它看起來像一個複選標記,正好在答案收到的分數下面。你也通過接受答案獲得+2聲望;) –