0

ビューに testplanViewModels のリストを表示し、ユーザーがいずれかを選択すると、SelectedTestplanId がコントローラーのポスト アクションに返されます。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));
4

1 に答える 1

1

HTML は実際にはそのようには機能しません。ドロップダウン (ヘルパーが要素を生成する) の投稿から複数の値を返すselect必要がある場合は、コントローラー内で解析するビュー モデルにプロパティを作成する必要があります。

たとえば、2 つの整数IDフィールドがある場合、結合されたプロパティは のような値を作成できます23_42。その後、メソッドを使用しSplitて正しい値 ( 23& 42) を取得できます。

于 2012-09-08T21:48:28.660 に答える