加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – Orchard CMS:未显示内容部分

发布时间:2020-12-16 03:30:06 所属栏目:asp.Net 来源:网络整理
导读:我创建了一个内容部分,并将其添加到内容类型. 当我创建内容类型时,与其他字段不同,不显示内容部分. 没有编译或记录的错误,内容部分已添加到placement.info. 司机: [UsedImplicitly]public class TradeItemPartDriver: ContentPartDriverTradeItemPart{ priv
我创建了一个内容部分,并将其添加到内容类型.
当我创建内容类型时,与其他字段不同,不显示内容部分.
没有编译或记录的错误,内容部分已添加到placement.info.

司机:

[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个问题.

首先,在迁移中,您在模型中调用了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; } 
    }
}

我也不确定Orchard是否会正确地将类型字节的列与int类型相关联.如果上述更改不起作用,请尝试将Unit列的列类型更改为int.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读