2017-06-08 11 views
0

私はオーチャードの初心者です。新しいアイテムが作成されたときにフォームデータを取得しようとしています。オーチャードのポストバックにデータを保存する

私が持っているのは、管理ダッシュボードにメニュー項目を作成するモジュールです。そのメニュー項目は、ユーザーが新しい「コーチ」を入力できるページをロードします。

コーチ、姓、名字、メールには3つのものが必要です。エディタ

@{ Layout.Title = T("Add Coach").ToString(); } 
@using (Html.BeginFormAntiForgeryPost()) { 
// Model is a Shape, calling Display() so that it is rendered using the most specific template for its Shape type 
@Display(Model) 
} 

を作成するための

ここで私はこのために実装したコードだ...

migrations.cs

public class SDSDataMigration : DataMigrationImpl 
{ 

    public int Create() 
    { 
     SchemaBuilder..CreateTable("CoachPartRecord", table => table.ContentPartRecord() 
.Column("FirstName", DbType.AnsiString, c => c.WithLength(50))                     
.Column("LastName", DbType.AnsiString, c => c.WithLength(50))                   
.Column("Email", DbType.AnsiString, c => c.WithLength(200))) 

     ContentDefinitionManager.AlterPartDefinition("CoachPart", part => part 
                      .WithField("FirstName", f => f.OfType("TextField")) 
                      .WithField("LastName", f => f.OfType("TextField")) 
                      .WithField("Email", f => f.OfType("TextField")) 
                     ); 

     ContentDefinitionManager.AlterTypeDefinition("Coach", type => type.WithPart("CommonPart") 
                      .WithPart("CoachPart")); 

     return 1; 
    } 

} 

部品/記録

public class CoachPartRecord : ContentPartRecord 
{ 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string Email { get; set; } 
} 

public class CoachPart : ContentPart<CoachPartRecord> 
{ 
    public string FirstName 
    { 
     get { return Record.FirstName; } 
     set { Record.FirstName = value; } 
    } 

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

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

ビューハンドラ(ダッシュボードのメニュー項目の)

public class CoachPartHandler : ContentHandler 
{ 
    public CoachPartHandler(IRepository<CoachPartRecord> repository) 
    { 
     Filters.Add(StorageFilter.For(repository)); 
    } 
} 

ドライバ

protected override DriverResult Editor(CoachPart part, IUpdateModel updater, dynamic shapeHelper) 
    { 
     updater.TryUpdateModel(part, Prefix, null, null); 
     return Editor(part, shapeHelper); 
    } 

コントローラ

public ActionResult Create() 
    { 
     var coach = _services.ContentManager.New("Coach"); 
     var model = _services.ContentManager.BuildEditor(coach); 
     return View(model); 
    } 

    [HttpPost, ActionName("Create")] 
    public ActionResult CreatePOST() 
    { 
     var contentItem = _services.ContentManager.New("Coach"); 
     _services.ContentManager.Publish(contentItem); 

     return View("Index"); 
    } 

今、私は新監督を作成するために、表示されるフォームを得ることができます。 「公開」をクリックすると、ドライバのCoachPartパラメータのすべてのフィールド(FirstName、LastName、Email)がnullになります。

私はhttpリクエストを見ることができ、私がフォームに入れた値を見ることができますが、彼らはCoachPartに値を渡していません。

CoachPartフィールドが提出されない理由は何ですか?

ありがとうございます!

答えて

0

まず、自分のレコードにプロパティを定義しています。あなたがこれを削除する必要がありますので、したがって、あなたは、あなたの部分に取り付けた新しいテキストフィールドを必要としません:あなたは果樹園のコンテンツコントローラのカスタムコントローラisteadを使用しているため

ContentDefinitionManager.AlterPartDefinition("CoachPart", part => part 
    .WithField("FirstName", f => f.OfType("TextField")) 
    .WithField("LastName", f => f.OfType("TextField")) 
    .WithField("Email", f => f.OfType("TextField"))); 

第二に、あなたはIUpdateModelを実装し、それに基づいて行動する必要があります。

[Admin] 
public class MyController : Controller, IUpdateModel { 
    private readonly IContentManager _contentManager; 
    private readonly ITransactionManager _transactionManager; 

    public MyController(IContentManager contentManager, 
     ITransactionManager transactionManager) { 

     _contentManager = contentManager; 
     _transactionManager = transactionManager; 
    } 

    [HttpPost, ActionName("Create")] 
    public ActionResult CreatePOST() 
    { 
     var contentItem = _contentManager.New<CoachPart>("Coach"); 

     // The implementation of IUpdateModel is necessary for this next line: 
     var model = _contentManager.UpdateEditor(contentItem, this); 

     if (!ModelState.IsValid) { 
      _transactionManager.Cancel(); 
      return View(model); 
     } 

     _contentManager.Publish(contentItem); 

     return View("Index"); 
    } 

    bool IUpdateModel.TryUpdateModel<TModel>(TModel model, string prefix, string[] includeProperties, string[] excludeProperties) { 
     return TryUpdateModel(model, prefix, includeProperties, excludeProperties); 
    } 

    void IUpdateModel.AddModelError(string key, LocalizedString errorMessage) { 
     ModelState.AddModelError(key, errorMessage.ToString()); 
    } 
} 
+0

ありがとうございます!それはそれだった。私はエディタテンプレートを実装する必要がありました。私もコードを変更する必要がありました... _contentManager.Publish(contentItem); 〜 _contentManager.Publish(contentItem.ContentItem); それ以降は保存が開始されました。私は数日間それを追いかけてきました。ありがとう! – cgreathouse

関連する問題