2014-01-20 2 views
2

과수원에서 1-1 관계를 만들 때 문제가 발생하여 드롭 다운 목록에서 선택한 항목의 값을 저장할 수 없습니다. 누군가가 나에게이 문제에 대해 어떻게 생각하는지 올바른 방향을 가르키면 appriciate겠습니까.과수원에서 1-1 관계 만들기

연락 부 드라이버

public class ContactPartDriver : ContentPartDriver<ContactPart> 
    { 
     private readonly IContactService _contactService; 
     public ContactPartDriver(IContactService contactService) 
     { 
      _contactService = contactService; 
     } 
     protected override string Prefix 
     { 
      get 
      { 
        return "Contact"; 
      } 
     } 
     protected override DriverResult Display(ContactPart part, 
         string displayType, dynamic shapeHelper) 
     { 
      return ContentShape("Parts_Contactindex1", 
         () => shapeHelper.Parts_Contactindex1(
          ContentPart: part, 
          Address: part.Address, 
          Name : part.Name, 
          EmailId: part.EmailId, 
          StateCode: part.Source.Id 
          )); 
     } 
     //Get 
     protected override DriverResult Editor(ContactPart part, dynamic shapeHelper) 
     { 
       return ContentShape("Parts_Contact_Edit",() => 
      shapeHelper.EditorTemplate(TemplateName: "Parts/Contactindex1", 
     Model:BuildEditorViewModel(part), Prefix: Prefix)); 
     } 
     //Post 
     protected override DriverResult Editor(ContactPart part, 
       IUpdateModel updater, dynamic shapeHelper) 
     { 
      var model = new EditContactViewModel(); 
      updater.TryUpdateModel(part, Prefix, null, null); 
      //if (part.ContentItem.Id != 0) 
      //{ 
      // _contactService.UpdateContactForContentItem(part.ContentItem, model); 

      //} 
      return Editor(part, shapeHelper); 
     } 

     private EditContactViewModel BuildEditorViewModel(ContactPart part) 
     { 
      var model = new EditContactViewModel { 
       Name = part.Name, 
       Address = part.Address, 
       EmailId = part.EmailId, 

       Sources = _contactService.GetSource() 

      }; 
      return model; 
      } 
     } 

} 

연락 처리기

public class ContactHandler :ContentHandler 
    { 
     public ContactHandler (IRepository<ContactPartRecord> respository) 
     { 

      Filters.Add(StorageFilter.For(respository)); 

     } 
    } 

모델 ContactPart

{ 
    public class ContactPart : ContentPart<ContactPartRecord> 
    { 

     public string Name 
     { 
      get { return Retrieve(x => x.Name); } 
      set { Store(x => x.Name, value); } 
     } 
     public string Address 
     { 
      get { return Retrieve(x => x.Address); } 
      set { Store(x => x.Address, value); } 
     } 
     public string EmailId 
     { 
      get { return Retrieve(x => x.EmailId); } 
      set { Store(x => x.EmailId, value); } 
     } 

     public SourceRecord Source 
     { 
      get { return Retrieve(x => x.SourceRecord); } 
      set {Store(x => x.SourceRecord,value);} 

     } 

    } 
} 

ContactPartRecord

{ 
    public class ContactPartRecord : ContentPartRecord 
    { 

     public virtual string Name { get; set; } 
     public virtual string Address { get; set; } 
     public virtual string EmailId { get; set; } 
     public virtual SourceRecord SourceRecord { get; set; } 

    } 
} 

기록 부분

{ 
    public class SourceRecord 
    { 
     public virtual int Id { get; set; } 
     public virtual string Type { get; set; } 

    } 

} 

연락 서비스

{ 
    public interface IContactService : IDependency { 
     void UpdateContactForContentItem(ContentItem item, EditContactViewModel model); 
     IEnumerable<SourceRecord> GetSource(); 
    } 

    public class ContactService : IContactService 
    { 
     private readonly IRepository<SourceRecord> _sourceRepository; 

     public ContactService(IRepository<SourceRecord> sourceRepository) 
     { 
      _sourceRepository = sourceRepository; 
     } 

     public void UpdateContactForContentItem(ContentItem item, EditContactViewModel model) 
     { 
      var contactPart = item.As<ContactPart>(); 
      contactPart.Address = model.Address; 
      contactPart.Name = model.Name; 
      contactPart.EmailId = model.EmailId; 
      contactPart.Source = _sourceRepository.Get(s => s.Id == model.SourceId); 
     } 

     public IEnumerable<SourceRecord> GetSource() 
     { 
      return _sourceRepository.Table.ToList(); 
     } 
    } 
} 

EditContactViewModel

{ 
    public class EditContactViewModel 
    { 
     public string Name { get; set; } 
     public string Address{ get; set; } 
     public string EmailId { get; set; } 
     public int SourceId { get; set; } 
     public IEnumerable<SourceRecord> Sources{ get; set; } 
    } 
} 

연락처보기

@using Cess.Contacts.ViewModel; 
@model EditContactViewModel 

<fieldset> 
    <legend>New Contact</legend> 
    @Html.LabelFor(m =>m.Name) 
    @Html.EditorFor(m => m.Name) 
    @Html.LabelFor(m => m.Address) 
    @Html.TextAreaFor(m => m.Address) 
    @Html.LabelFor(m => m.EmailId) 
    @Html.EditorFor(m => m.EmailId) 
    <p> 
    @Html.DropDownListFor(model => model.Sources, 
         Model.Sources.Select(s => new SelectListItem 
         { 
          Selected = s.Id == Model.SourceId, 
          Text = s.Type , 
          Value = s.Id.ToString() 
         }), 
         "Choose a Source...") 
    </p> 
</fieldset> 

답변

2

ErMasca는 한 가지 실수를 올바르게 지적했습니다.

또한 ContentPart에서 네비게이션 속성에 액세스하려면 Record.SourceRecord를 사용해야합니다.

public SourceRecord Source() 
{ 
    get { return Record.SourceRecord; } 
    set { Record.SourceRecord = value; } 
} 
2

http://docs.orchardproject.net/Documentation/Creating-1-n-and-n-n-relations 그럼에도 불구하고보기에서 드롭 다운은 실제로 SourceId를 유지하지 않습니다. 변화는에 :

@Html.DropDownListFor(model => model.SourceId, 
         Model.Sources.Select(s => new SelectListItem 
         { 
          Selected = s.Id == Model.SourceId, 
          Text = s.Type , 
          Value = s.Id.ToString() 
         }), 
         "Choose a Source...") 

다시 테이블에 대해 검사 할 수있게됩니다.

+0

실제로 @Yash, 샘이 잘하고 있다고 생각합니다. 그는 새로운 infoset 모델을 사용하고 있으며 모든 것을 관리해야합니다. 아직 사용하지 않았습니다. 다음 프로젝트에서 곧 할 수 있습니다. 여기에 약간의 링크가 있습니다. http://weblogs.asp.net/bleroy/archive/2013/11/04/the-shift-how-orchard -pastely-shifted-document-storage-and-how-it-l-affect-you.aspx (죄송합니다. 내 의견에 댓글을 달 수 있습니다.) – ErMasca

+0

예 infoset 교대를 알고 있습니다. 나는 비슷한 것을 시도했다. 하지만 관계형 속성의 경우 Record.value를 사용해야하는 것처럼 보입니다. – Yashvit