ViewBagsを使用することは一般的に悪い習慣であり、ViewBagとViewModelを混在させることも悪いことだと読みましたが、いくつかのViewBagsを使用しsort order
てコントローラーとビューの間でパラメーターを渡していますが、ビューのプロパティを作成できViewModel
ますそもそもモデルを作成する前に値が必要なので、これを回避する方法がわかりません。
コントローラ
public ActionResult Index(string sortOrder, string searchString,
string currentFilter, int? page,
bool? includeComplete)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParam = string.IsNullOrWhiteSpace(sortOrder) ? "Name desc" : "";
ViewBag.DateSortParam = sortOrder == "Date" ? "Date desc" : "Date";
if (Request.HttpMethod == "GET")
searchString = currentFilter;
else
page = 1;
ViewBag.CurrentFilter = searchString;
bool showCompleted = (includeComplete == null || includeComplete == false)
? false : true;
ViewBag.IncludeCompleted = showCompleted;
int pageNumber = (page ?? 1);
var query = Session.QueryOver<ToDo>();
if (!string.IsNullOrWhiteSpace(searchString))
query = query.WhereRestrictionOn(td => td.TaskName)
.IsInsensitiveLike(string.Format("%{0}%", searchString));
if (!showCompleted)
query.And(td => td.IsComplete == false);
switch (sortOrder)
{
case "Name desc":
query = query.OrderBy(td => td.TaskName).Desc;
break;
case "Date":
query = query.OrderBy(td => td.DueDate).Asc;
break;
case "Date desc":
query = query.OrderBy(td => td.DueDate).Desc;
break;
default:
query = query.OrderBy(td => td.TaskName).Asc;
break;
}
var result = query.Fetch(p=>p.Priority).Eager
.Fetch(s=>s.Staff).Eager
.List();
var viewModel = AutoMapper.Mapper.Map<IEnumerable<ToDo>,
IEnumerable<IndexToDoViewModel>>(result)
.ToPagedList(pageNumber, PageSize);
return View(viewModel);
}
次に、ViewBag を使用してコントローラーに値を返します。たとえば、メソッドの大部分を形成するクエリsortOrder
に適用する前に必要な値です。たとえば、次のようになります。NHibernate
@Html.ActionLink("Name", "Index", new {sortOrder=ViewBag.NameSortParam,
includeComplete = ViewBag.IncludeCompleted})
私のビューモデル
public class IndexToDoViewModel
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd MMM yyyy}")]
[DisplayName("Date Due")]
public DateTime? DueDate { get; set; }
public Guid Id { get; set; }
[DisplayName("Is Complete")]
public bool IsComplete { get; set; }
[DataType(DataType.MultilineText)]
public String Notes { get; set; }
public string Priority { get; set; }
public string Staff {get; set;}
[DisplayName("Name")]
public String TaskName { get; set; }
// These would potentially replace my ViewBag?
public string CurrentSort { get; set; }
public string CurrentFilter { get; set; }
public string NameSortParam { get; set; }
public string DateSortParam { get; set; }
public bool IncludeCompleted { get; set; }
}