MVC - EF Binding无法处理更新

时间:2016-10-14 13:16:08

标签: c# asp.net-mvc entity-framework binding automapper

这让我疯了。我会一步一步走。

这是我的模特:

public class Debate : BaseEntity
{
    public string Title { get; set; }

    public string Description { get; set; }

    public virtual Team Team1 { get; set; }

    public virtual Team Team2 { get; set; }

    //Problem here.
    public virtual Cathegory Cathegory { get; set; }

}

这是我的ViewModel(编辑时)

public class DebateEditVm : BaseVm
{
    [Required]
    public string Title { get; set; }

    [Required]
    public string Description { get; set; }

    public  TeamVm Team1 { get; set; }

    public  TeamVm Team2 { get; set; }

    //The Value of the selected one.
    public Guid Cathegory { get; set; }

    //List of different cathegories. I show this in the view with a @Html.DropDownListFor
    public List<CathegoryVm> Cathegories { get; set; }

    public DebateAltaVm()
    {   
        Team1 = new TeamVm();
        Team2 = new TeamVm();
    }
}

在我的编辑(发布)中,我有以下内容。

          public ActionResult Edit([Bind(Include =   Id,Title,Description,Team1,Team2,Cathegory")] DebateEditVm debate)
    {
            //Automapper from VM to MODEL
            var debateEntity = Mapper.Map<Debate>(debate);

            //Either with this commented or not wont Update the Cathegory of the debate!!!!!!!!
            //debateEntity.Cathegory = Db.Categorias.Find(debateEntity.Cathegory.Id);

            Db.Entry(debateEntity).State = EntityState.Modified;
            Db.Entry(debateEntity.Team1).State = EntityState.Modified;
            Db.Entry(debateEntity.Team2).State = EntityState.Modified;

            Db.SaveChanges();

            return RedirectToAction("Index");
        }
        return View(debate);
    }

自动播放设置

       Mapper.CreateMap<Debate, DebateEditVm>()
             .ForMember(m => m.Cathegory, opt=>opt.MapFrom(m=>m.Cathegory.Id));


        Mapper.CreateMap<DebateEditVm, Debate>()
            .ForMember(m => m.Cathegory, opt => opt.ResolveUsing(vm => new Cathegory {Id = vm.Cathegory}));

所以新的VALUE绑定到VM,当我尝试更新辩论时,所有更改都很好,除了Cathegory(我也尝试使用注释行)

我做错了什么?

1 个答案:

答案 0 :(得分:0)

ResolveUsing用于使用自定义值解析器。我只见过使用的通用版本,即ResolveUsing<MyCustomValueResolver>(...),所以我不确定在没有提供自定义值解析器的情况下到底发生了什么。但是,一般来说,它的工作方式是传入的值不是返回的值,而只是传递给值解析器的值。值解析器然后执行传入的内容并返回它。

长而短,看起来你应该在这里使用MapFrom

Mapper.CreateMap<DebateEditVm, Debate>()
    .ForMember(dest => dest.Cathegory, opts => opts.MapFrom(src => new Cathegory { Id = src.Cathegory }));

虽然我们在这里,但有一件事。不要使用Bind属性,尤其是当您已经在使用视图模型时。视图模型的整个要点是仅显示视图所需的内容,因此Bind应该完全没必要。此外,由于视图模型的本质是您必须将数据从它移动到您的实体,因此您可以明确地控制什么是允许修改和不允许修改。 Bind的全部目的是阻止用户修改他们不应该使用的属性,但除非允许,否则没有时间对视图模型执行此操作。< / p>