У меня возникла небольшая проблема с созданием простого виджета. Все, что я хочу сделать, это создать виджет, который имеет 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>