当我在我的视图中显示testplanViewModel的列表并且用户选择一个时,SelectedTestplanId返回到Controller后动作。还应该返回的是属于SelectedTestplanId的TemplateId。将ViewModel绑定到DropDownListFor除第三个值以外dataValueField/dataTextField
当AutoMapper定义运行Testplan.TestplanId被隐式地复制到TestplanViewModel.TestplanId。通过在TestplanViewModel上提供TemplateId可以完成相同的操作。当用户在视图中选择“TestplanViewModel”时,如何将TemplateId附加到控制器操作以在那里访问它? DropDownList不允许2个dataValueFields!
CreateMap<Testplan, TestplanViewModel>().ForMember(dest => dest.Name, opt => opt.MapFrom(src => string.Format("{0}-{1}-{2}-{3}", src.Release.Name, src.Template.Name, src.CreatedAt, src.CreatedBy)));
public ActionResult OpenTestplanViewModels()
{
IEnumerable<Testplan> testplans = _testplanDataProvider.GetTestplans();
var viewModel = new OpenTestplanViewModel
{
DisplayList = Mapper.Map<IEnumerable<Testplan>, IEnumerable<TestplanViewModel>>(testplans)
};
return PartialView(viewModel);
}
public class TestplanViewModel
{
public int TestplanId { get; set; }
public string Name { get; set; }
}
public class OpenTestplanViewModel
{
[Required(ErrorMessage = "No item selected.")]
public int SelectedTestplanId { get; set; }
public IEnumerable<TestplanViewModel> DisplayList { get; set; }
}
OpenTestplanViewModel
@using (Html.BeginForm("Open", "Testplan"))
{
@Html.ValidationSummary(false)
@Html.DropDownListFor(x => x.SelectedTestplanId, new SelectList(Model.DisplayList, "TestplanId", "Name"), new { @class = "listviewmodel" })
}
解决方案:
public class OpenTestplanViewModel
{
[Required(ErrorMessage = "No item selected.")]
public string TestplanIdAndTemplateId { get; set; }
public IEnumerable<TestplanViewModel> DisplayList { get; set; }
public int SelectedTestplanId
{
get
{
return Convert.ToInt32(TestplanIdAndTemplateId.Split(new[] { '_' }).First());
}
}
public int SelectedTemplateId
{
get
{
return Convert.ToInt32(TestplanIdAndTemplateId.Split(new[] { '_' }).Last());
}
}
}
CreateMap<Testplan, TestplanViewModel>()
.ForMember(d => d.Name, o => o.MapFrom(src => string.Format("{0}-{1}-{2}-{3}", src.Release.Name, src.Template.Name, src.CreatedAt, src.CreatedBy)))
.ForMember(d => d.TestplanIdAndTemplateId, o => o.MapFrom(src => src.TestplanId + "_" + src.TemplateId));
好吧我这样做,它的工作原理。查看更新的代码。但是我正在考虑这个逻辑属于视图模型,或者是在AutoMapper中创建一个自定义模型绑定器。将在一个新的问题中做到这一点。 – Elisabeth