我正在创建一个简单的todo应用程序,它有两个实体,tasks
和categories
。
要创建task
,必须选择category
。为此,我想我需要一个ViewModel。
这是任务实体
public class Task
{
public int taskId { get; set; }
public int categoryId { get; set; }
public string taskName { get; set; }
public bool isCompleted { get; set; }
public DateTime creationDate { get; set; }
public DateTime completionDate { get; set; }
public string remarks { get; set; }
public string completionRemarks { get; set; }
}
这是分类实体
public class Category
{
public int categoryId { get; set; }
public string categoryName { get; set; }
}
如何设计TaskCategoryViewModel
,以便在CreateTask
视图中绑定category
?
编辑:我使用的是经典的ADO.NET,而不是实体框架或LINQ to SQL。
Kishor,
最好的选择是有一个模型,可以为你的任务和类别(一体化)定义hods
以下是一切如何联系在一起的。
其中
IEnumerable<SelectListItem> Categories
用于创建准备使用的下拉列表
<%= Html.DropDownListFor(model=>model.NewTask.categoryId, Model.Categories) %>
这将为您创建一个不错的下拉列表
private IEnumerable<Category> GetCategories
{
get
{
List<Category> categories = new List<Category>
{
new Category() {categoryId = 1, categoryName = "test1"},
new Category() {categoryId = 2, categoryName = "category2"}
};
return categories;
}
}
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult CreateTask()
{
TaskModel taskModel = new TaskModel();
LoadCategoriesForModel(taskModel);
return View(taskModel);
}
private void LoadCategoriesForModel(TaskModel taskModel)
{
taskModel.Categories =
GetCategories.Select(
x =>
new SelectListItem()
{Text = x.categoryName, Value = x.categoryId.ToString(CultureInfo.InvariantCulture)});
}
public ActionResult CreateTask(TaskModel taskModel)
{
if (ModelState.IsValid)
{
// do your logic for saving
return RedirectToAction("Index");
}
else
{
LoadCategoriesForModel(taskModel);
return View(taskModel);
}
}
/// <summary>
/// your model for creation
/// </summary>
public class TaskModel
{
public Task NewTask { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
}
/// <summary>
/// Task
/// </summary>
public class Task
{
public int taskId { get; set; }
public int categoryId { get; set; }
public string taskName { get; set; }
public bool isCompleted { get; set; }
public DateTime creationDate { get; set; }
public DateTime completionDate { get; set; }
public string remarks { get; set; }
public string completionRemarks { get; set; }
}
/// <summary>
/// Category
/// </summary>
public class Category
{
public int categoryId { get; set; }
public string categoryName { get; set; }
}
在TaskViewModel中(我更喜欢将其命名为CreateTaskViewModel)为类别选择列表创建属性
public IEnumerable<SelectListItem> CategoriesSelectList;
在控制器中,在返回视图之前绑定该属性(注意,当ModelState无效时,这也应该在后处理程序中完成)
public ViewResult Create()
{
CreateTaskViewModel model = new CreateTaskViewModel();
model.CategoriesSelectList = _repository.AllCategories().Select(x=> new SelectListItem(){ Text = x.CategoryName, Value = x.CategoryId.ToString();}
}
最后,在看来
Html.DropDownListFor(model => model.CategoryId, Model.CategoriesSelectList)
编辑:
在您的代码中,_repository.AllCategories()
应该替换为数据访问代码,该代码返回类型为IEnumerable<Category>
的对象。实际上,使用哪种数据访问技术并不重要。如果缺少using System.Linq;
语句,请不要忘记将其添加到控制器文件中。