2012-12-22 4 views
2

간단한 위젯을 만드는 데 약간의 문제가있었습니다. MediaPickerField 및 2 int 및 2 문자열 필드가있는 위젯을 만들면됩니다.이 필드는 파트를 사용하여 데이터베이스에 저장됩니다. 모든 것은 광고 된대로 작동합니다. 네 개의 필드가 저장되지 않는다는 것을 제외하고 ContentRecord가 생성되고 이미지 필드가 올바르게 저장됩니다. 로그에 오류가 없으며 이것이 왜 발생하는지 알 수 없습니다. 누구도 전에 이것을 보았습니까? 고맙습니다.과수원 단순 위젯 데이터베이스 값을 저장하지 않음

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

PartRecord

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

EditorTemplage

@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> 
+0

는 게시물 편집기 방법에 중단 점을 넣고 TryUpdatemodel에 대한 호출이 실제로 일부 변경되어 있는지 확인합니다. –

답변

2

오차드은 항상 데이터베이스에 데이터를 저장 Record 클래스의 내용을 사용하고 있습니다. 반면에 브라우저의 데이터를 Part 클래스에 저장하고 있는데 PartRecord 클래스를 제대로 연결하지 않았습니다.

그렇게하려면, 당신은 당신의 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; } 
    } 
} 
관련 문제