我正在创建一个简单的待办事项应用程序,它有两个实体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
以便我可以在category
视图中绑定CreateTask
?
编辑:我使用的是经典的ADO.NET,而不是实体框架或LINQ to SQL。
答案 0 :(得分:1)
在TaskViewModel(我更喜欢命名为CreateTaskViewModel)创建类别选择列表的属性
public IEnumerable<SelectListItem> CategoriesSelectList;
在控制器中,在返回视图之前绑定该属性(请注意,这也应该在post处理程序中完成,当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;
语句添加到控制器文件中(如果它已丢失。
答案 1 :(得分:1)
基肖尔,
最好的选择是拥有为您的任务和类别(一体化)定义的模型
这里是一切如何挂在一起。
其中
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; }
}