如何为待办事项列表应用程序设计ViewModel?

时间:2012-01-15 04:48:26

标签: asp.net-mvc asp.net-mvc-2 viewmodel

我正在创建一个简单的待办事项应用程序,它有两个实体taskscategories

要创建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。

2 个答案:

答案 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; }
    }