2012-11-05 10 views
5

Ho creato una parte di contenuto e la aggiungo al tipo di contenuto. Quando creo il tipo di contenuto, una parte del contenuto non viene visualizzata, a differenza degli altri campi. Nessun errore di compilazione o registrazione, parte del contenuto aggiunta a placement.info.CMS frutteto: parte del contenuto non visualizzata

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

Modelli:

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

~/Vista/EditorTemplates/Parts/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:

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

Migrations:

 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

Hai abilitato la funzione? –

risposta

12

Ci sono generalmente 2 problemi con il tuo codice.

Innanzitutto, durante le migrazioni, hai chiamato la parte TradeItem mentre nel modello, l'hai chiamata TradeItemPart. Cambiare l'uno o l'altro risolverà il problema del perché nulla viene mostrato nell'editor.

Il che ci porta al secondo problema che disabiliterà il salvataggio di tutti i dati. Non hai collegato il tuo TradeItemPart con il tuo TradeItemPartRecord. Per risolvere questo problema, è necessario modificare TradeItemPart in modo che assomiglia a questo:

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

Io non sono sicuro se anche Orchard sarà correttamente associare colonna di tipo byte al tipo int. Se le modifiche sopra menzionate non funzionano, prova a modificare il tipo di colonna della colonna Unit su int.

+1

Sì, funziona! Grazie, amico, grazie mille! PS: OMG, molti errori ... Dov'era la mia testa? – Blush

+1

Purtroppo, la mia reputazione è ancora insufficiente per un voto :( Ma ovviamente voterò immediatamente dopo aver raggiunto la reputazione richiesta :) – Blush

+0

Nessun problema, ma penso che si possa ancora contrassegnare la risposta come accettata. Sembra un segno di spunta immediatamente sotto il punteggio della risposta ricevuta. Ottieni anche +2 reputazione accettando la risposta;) –

Problemi correlati