Orchard Simple Widget не сохраняет значения базы данных

У меня возникла небольшая проблема с созданием простого виджета. Все, что я хочу сделать, это создать виджет, который имеет MediaPickerField и 2 поля int и 2 строки, которые хранятся в базе данных с использованием части. Все работает как рекламируется. Создается ContentRecord, и поле изображения сохраняется правильно, за исключением того, что четыре поля не сохраняются. В журналах нет ошибок, и я не могу понять, почему это происходит. Кто-нибудь сталкивался с этим раньше? Спасибо.

Миграция.cs

public int UpdateFrom1()
    {
        SchemaBuilder.CreateTable("SchoenNavButtonPartRecord",
            table => table.ContentPartRecord()
                          .Column<string>("Url", col=> col.WithLength(2140))
                          .Column<string>("Text")
                          .Column<int>("ButtonWidth")
                          .Column<int>("ButtonHeight"));
        ContentDefinitionManager.AlterTypeDefinition("SchoenNavButton", builder => 
            builder.WithPart("CommonPart")
                   .WithPart("SchoenNavButtonPart")
                   .WithPart("TitlePart")
                   .Creatable());
        ContentDefinitionManager.AlterPartDefinition("SchoenNavButtonPart", builder => 
            builder.WithField("ButtonImage", field=> 
                field.OfType("MediaPickerField")
                    .WithDisplayName("Button Image")
                    .WithSetting("Hint", "Select Image for Button")));
        return 2;
    }

ЧастьЗапись

public class SchoenNavButtonPartRecord : ContentPartRecord
{
    public virtual string Url { get; set; }
    public virtual string Text { get; set; }
    public virtual int ButtonWidth { get; set; }
    public virtual int ButtonHeight { get; set; }
}

Часть

public class SchoenNavButtonPart : ContentPart<SchoenNavButtonPartRecord>
{
    public string Url { get; set; }
    public string Text { get; set; }

    [DefaultValue(296)]
    public int ButtonWidth { get; set; }

    [DefaultValue(188)]
    public int ButtonHeight { get; set; }
}

Обработчик

public class SchoenNavButtonHandler : ContentHandler
{
    public SchoenNavButtonHandler(IRepository<SchoenNavButtonPartRecord> buttonImageLinkRepository)
    {
        Filters.Add(StorageFilter.For(buttonImageLinkRepository));
    }

}

Водитель

public class SchoenNavButtonPartDriver : ContentPartDriver<SchoenNavButtonPart>
{
    public SchoenNavButtonPartDriver()
    {

    }
    protected override string Prefix
    {
        get
        {
            return "SchoenNavButton";
        }
    }
    protected override DriverResult Display(SchoenNavButtonPart part, string displayType, dynamic shapeHelper)
    {
        var fields = ((ContentPart) part).Fields.OfType<MediaPickerField>();
        MediaPickerField mediaPickerField = null;
        if(fields.Any())
        {
            mediaPickerField = fields.ElementAt(0);
        }
        return ContentShape("Parts_SchoenNavButton",
                         () => shapeHelper.Parts_SchoenNavButton(
                             SchoenNavButtonPart: part,
                             ImageUrl: mediaPickerField == null ? "#" : mediaPickerField.Url
                                   ));
    }
    protected override DriverResult Editor(SchoenNavButtonPart part, dynamic shapeHelper)
    {
        return ContentShape("Parts_SchoenNavButton_Edit", () =>
            shapeHelper.EditorTemplate(
                TemplateName: "Parts/SchoenNavButton",
                Model: part,
                Prefix: Prefix));
    }
    protected override DriverResult Editor(SchoenNavButtonPart part, Orchard.ContentManagement.IUpdateModel updater, dynamic shapeHelper)
    {
        updater.TryUpdateModel(part, Prefix, null, null);
        return Editor(part, shapeHelper);
    }
}

РедакторШаблон

@model FishySoftware.SchoenBuilders.Models.SchoenNavButtonPart

<fieldset>
    <legend>Button Details</legend>
    <div class="editor-label">
        @Html.LabelFor(model => model.Url, T("Url"))
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.Url)
        @Html.ValidationMessageFor(model => model.Url)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.Text, T("Text"))
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.Text)
        @Html.ValidationMessageFor(model => model.Text)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.ButtonWidth, T("Button Width"))
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.ButtonWidth)
        @Html.ValidationMessageFor(model => model.ButtonWidth)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.ButtonHeight, T("Button Height"))
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.ButtonHeight)
        @Html.ValidationMessageFor(model => model.ButtonHeight)
    </div>
</fieldset>

person idgas15    schedule 22.12.2012    source источник
comment
Поставьте точку останова в методе редактора сообщений и проверьте, действительно ли вызов TryUpdatemodel изменяет часть.   -  person Bertrand Le Roy    schedule 22.12.2012


Ответы (1)


Orchard всегда использует содержимое классов Record для сохранения данных в базе данных. Вы, с другой стороны, сохраняете данные из браузера внутри класса Part и неправильно соединили свои классы Part и Record.

Для этого вам нужно изменить ShoenNavButtonPart на это:

public class SchoenNavButtonPart : ContentPart<SchoenNavButtonPartRecord>
{
    public string Url { 
        get { return Record.Url; } 
        set { Record.Url = value; }
    }

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

    [DefaultValue(296)]
    public int ButtonWidth { 
        get { return Record.ButtonWidth; } 
        set { Record.ButtonWidth = value; }
    }

    [DefaultValue(188)]
    public int ButtonHeight { 
        get { return Record.ButtonHeight; } 
        set { Record.ButtonHeight = value; }
    }
}
person Ivan Ferić    schedule 22.12.2012