簡體   English   中英

使用除dataValueField / dataTextField之外的第三個值將ViewModel綁定到DropDownListFor

[英]Bind a ViewModel to a DropDownListFor with a third value besides dataValueField/dataTextField

當我在視圖中顯示testplanViewModels列表並且用戶選擇一個列表時,SelectedTestplanId將返回到Controller后操作。 還應該返回的是屬於SelectedTestplanId的TemplateId。

運行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));

HTML並不是真的那樣工作。 如果您希望從帖子中為下拉列表返回多個值(幫助程序會生成一個select元素),則必須在視圖模型上創建一個屬性,然后在控制器中進行解析。

例如,如果您有兩個整數ID字段,則Combined屬性可以創建一個看起來像23_42的值。 然后,您可以使用Split方法來取回正確的值( 2342 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM