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



我正在创建一个简单的todo应用程序,它有两个实体,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,以便在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;语句,请不要忘记将其添加到控制器文件中。

相关内容

  • 没有找到相关文章

最新更新