Orchardcms 在Orchard中创建1-1关系

Orchardcms 在Orchard中创建1-1关系,orchardcms,orchardcms-1.7,Orchardcms,Orchardcms 1.7,在orchard中创建1-1关系时出现问题,无法保存下拉列表中所选项目的值。如果有人给我指出了解决这个问题的正确方向,我会很感激的 接触件驱动器 public class ContactPartDriver : ContentPartDriver<ContactPart> { private readonly IContactService _contactService; public ContactPartDriver(IContactS

在orchard中创建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 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();
        }
    }
}
{
公共接口IContactService:IDependency{
作废UpdateContactForContentItem(ContentItem项,EditContactViewModel模型);
IEnumerable GetSource();
}
公共类ContactService:IContactService
{
私有只读IRepository\u sourceRepository;
公共联系人服务(IRepository sourceRepository)
{
_sourceRepository=sourceRepository;
}
public void UpdateContactForContentItem(ContentItem项,EditContactViewModel模型)
{
var contactPart=item.As();
contactPart.Address=model.Address;
contactPart.Name=model.Name;
contactPart.EmailId=model.EmailId;
contactPart.Source=\u sourceRepository.Get(s=>s.Id==model.SourceId);
}
公共IEnumerable 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; }
    }
}
{
公共类EditContactViewModel
{
公共字符串名称{get;set;}
公共字符串地址{get;set;}
公共字符串EmailId{get;set;}
public int SourceId{get;set;}
公共IEnumerable源{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>
@使用Cess.Contacts.ViewModel;
@模型EditContactViewModel
新联系人
@LabelFor(m=>m.Name)
@EditorFor(m=>m.Name)
@LabelFor(m=>m.Address)
@Html.TextAreaFor(m=>m.Address)
@LabelFor(m=>m.EmailId)
@EditorFor(m=>m.EmailId)

@DropDownListFor(model=>model.Sources,
Model.Sources.Select(s=>newselectListItem
{
所选=s.Id==Model.SourceId,
Text=s.类型,
Value=s.Id.ToString()
}),
“选择一个源…”

然而,在您看来,下拉列表并没有真正保留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...")
将允许再次对照表进行检查

然而,在您看来,下拉列表并没有真正保留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...")

将允许再次对照表进行检查

埃尔马斯卡正确地指出了一个错误

在ContentPart中,还需要使用Record.SourceRecord访问导航属性

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

埃玛斯卡正确地指出了一个错误

在ContentPart中,还需要使用Record.SourceRecord访问导航属性

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

事实上,@Yash,我认为Sam做得很好。他正在使用新的信息集模型,它应该会处理好一切。我还没用过。。在我的下一个项目中将很快完成这里有一个小链接:(对不起,我可以在你的评论下面发表评论)是的,我知道信息集的变化。我也试过做类似的事情。但对于关系属性,似乎必须使用Record.values@Yash,我认为Sam做得还不错。他正在使用新的信息集模型,它应该会处理好一切。我还没用过。。在我的下一个项目中将很快完成这里有一个小链接:(对不起,我可以在你的评论下面发表评论)是的,我知道信息集的变化。我也试过做类似的事情。但对于关系属性,似乎必须使用Record.value
public SourceRecord Source()
{
  get { return Record.SourceRecord; }
  set { Record.SourceRecord = value; }
}