誰かが次のことで私を助けることができるかどうか疑問に思っていました. フォーラムをよく調べましたが、私のニーズに合った静かなものは見つかりませんでした。私は Generics も MVC も初めてなので、気楽にやってください :-)。
基本的に、ジェネリック リスト モデルをジェネリック ビューに渡して、リストをレンダリングするジェネリック html ヘルパーを呼び出したいと考えています。
同じ抽象クラスから継承する 2 つのビュー モデルがあります…</p>
public abstract class DisplayableViewModel
{
[HiddenInput(DisplayValue = false)]
[Key]
public int ID { get; set; }
}
public class ContactListViewModel : DisplayableViewModel
{
public string FullName { get; set; }
public string ContactLandline { get; set; }
public string ContactEmail { get; set; }
}
public class ProductListViewModel : DisplayableViewModel
{
public string ProductCompany { get; set; }
public string ProductDesc { get; set; }
public decimal ProductPrice { get; set; }
public string ProductCategory { get; set; }
}
次に、私のコントローラーは SearchViewModel のオブジェクトを作成します…</p>
public class SearchViewModel<T>
{
public IEnumerable<T> Entity { get; set; }
public PagingInfo PagingInfo { get; set; }
}
これには、ビュー モデルの 1 つのオブジェクト (提供した例では ContactListViewModel ですが、ProductListViewModel である可能性もあります)、ページング用の情報が取り込まれ、ビューに返されます。
public ViewResult List(int page = 1)
{
ContactListViewModel[] e = Mapper.Map<Contact[], ContactListViewModel[]>(repository.Contact.ToArray());
SearchViewModel<DisplayableViewModel> viewModel = new SearchViewModel<DisplayableViewModel>
{
Entity = e,
PagingInfo = new PagingInfo
{
CurrentPage = page,
ItemsPerPage = PageSize,
TotalItems = e.Count()
}
};
return View(viewModel);
}
ビューは次のことを行います…</p>
@using AppForProducts.WebUI.Models
@model AppForProducts.WebUI.Models.SearchViewModel<DisplayableViewModel>
@{
ViewBag.Title = "List";
}
@(Html.DataGrid<DisplayableViewModel>(Model.Entity))
<div class="pager">
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))
</div>
html.DataGrid は、特定のタイプのレコードのリストを単純にレンダリングするヘルパーであるため、1 つ以上の列を含めることができます (見たい場合は、ここにあります… http://stephenwalther.com/ blog/archive/2009/03/03/chapter-6-understanding-html-helpers.aspx - これを行う機能が MVC に追加されたことは理解していますが、これはトレーニング演習として行っています)。
私が抱えている問題は、DisplayableViewModel がビューの Type パラメーターであるため、ID のリストのみをレンダリングすることです。Type パラメーターとして ContactListViewModel を指定して html.DataGrid を呼び出すと機能しますが、同じビューを使用して ProductListViewModel などの別のモデルをレンダリングすることはできません。また、Type パラメーターを省略した場合、コンパイラーは、型を推論できないため、型を明示的に指定する必要があると言います。
これが一般的に機能する方法はありますか?コントローラーから渡されたものに応じて、ContactListViewModel または ProductListViewModel として定義されるビューでタイプ T を指定できるようにしたいと考えています。
みんな、ありがとう、
ジム