这让我疯了。我会一步一步走。
这是我的模特:
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(我也尝试使用注释行)
我做错了什么?
答案 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>