2012-09-08 36 views
0

当我在我的视图中显示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)); 

回答

1

HTML并未真正发挥作用的方式。如果您希望从帖子中返回多个值作为下拉列表(帮助程序会生成一个select元素),则必须在视图模型上创建一个属性,然后在控制器中进行解析。

例如,如果您有两个整数ID字段,则组合的属性可能会创建一个类似23_42的值。然后,您可以使用Split方法获取正确的值(23 & 42)。

+0

好吧我这样做,它的工作原理。查看更新的代码。但是我正在考虑这个逻辑属于视图模型,或者是在AutoMapper中创建一个自定义模型绑定器。将在一个新的问题中做到这一点。 – Elisabeth