2012-09-08 38 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