asp.netのMVC3でビューモデルを構築する場合、そのビューモデルのオブジェクトをインスタンス化するコードはどこですか?私は主にデータベース内のコードを照会する以外に、今コントローラーでやっています。ここでは、コードの例です:ビューモデルを構築するためのコードはどこにありますか?
ビューモデル:
public class WorkListVM
{
//list for employees
[Display(Name = "Select A Employee")]
[Required]
public int? EmployeeId { get; set; }
public GenericSelectList EmployeeList { get; set; }
}
コントローラコード:
//build view model
var vm = new WorkListVM();
//build employee list
vm.EmployeeList = new GenericSelectList(0,"-- Select Employee --");
var employees = new List<Employee>();
using (var gr = new GenericRepo<Employee>())
{
employees = gr.Get().ToList();
}
foreach(var employee in employees)
{
var gl = new GenericListItem();
gl.Id = employee.EmployeeId;
gl.DisplayFields = employee.FirstName + " " + employee.LastName;
vm.EmployeeList.Values.Add(gl);
}
ジェネリック選択リストがヘルパーに@html.dropdownfor
年代を行くデータを保持する単純なクラスですSelectList
。私はこれらの選択リストを作成し、コントローラコード内のビューモデルの同様のデータ構成を構築します。このコードをホストしているコントローラーには合計109行のコードがあるため、膨大ではありません。しかし、私はいつも冗長性を減らそうと努力しており、時には//build employee list
のコードがコピー貼り付けされてしまいます(ugh、私はコピー貼り付けが嫌いです)。
このコードを保存するのに適した場所はありますか?おそらく、これらの選択リスト/その他のビュー・データ・オブジェクトのデータを構築するためにファクトリ・パターンを使用する必要がありますか?すべてのあなたの助けを
EDIT
感謝。私がやったことがここにあります。私はリチャードとジェシーによって提案.ToSelectList(...)と非常によく似て、一般的な選択リストクラス内のメソッドを作ることになった:
public class GenericSelectList
{
public List<GenericListItem> Values { get; set; }
public int StartValue { get; set; }
public string Message { get; set; }
public GenericSelectList(int StartValue = 0, string Message = "select")
{
Values = new List<GenericListItem>();
this.StartValue = StartValue;
this.Message = Message;
}
public void BuildValues<T>(List<T> items, Func<T, int> value, Func<T, string> text) where T : class
{
this.Values = items.Select(f => new GenericListItem()
{
Id = value(f),
DisplayFields = text(f)
}).ToList();
}
}
viewmodelをビューに戻すと、コードがコントローラに入ります。 –
@白ジェームス - はい、このactionresultメソッドの最後に 'return View(vm);'があります。ビューは強い型の '@model WorkListVM'です。このコードの一部は、複数のコントローラで使用されます。冗長性を減らすために、これらのビューモデルオブジェクトの作成をラップするファクトリを持つことは理にかなっていませんか? –