Как разработать ViewModel для приложения списка задач? - PullRequest
0 голосов
/ 15 января 2012

Я создаю простое приложение todo, которое имеет две сущности, tasks и categories.

. Чтобы создать task, необходимо выбрать category.Для этого я подумал, что мне понадобится ViewModel.

Вот сущность Task

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

Вот сущность Category

public class Category
{
    public int categoryId { get; set; }
    public string categoryName { get; set; }
}

Как мне создатьTaskCategoryViewModel чтобы я мог связать category в представлении CreateTask?

Редактировать: Я использую классический ADO.NET вместо Entity Framework или LINQ to SQL.

Ответы [ 2 ]

1 голос
/ 15 января 2012

Кишор,

Лучше всего иметь модель, которая содержит определение для вашей задачи и для категории (все в одном)

, вот как все соединяется.

где

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; }
    }
1 голос
/ 15 января 2012

В 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)

Edit:

В вашем коде _repository.AllCategories() должен быть заменен вашим кодом доступа к данным, который возвращает объект типа IEnumerable<Category>. На самом деле не имеет значения, какую технологию доступа к данным вы используете. И не забудьте добавить оператор using System.Linq; в файл вашего контроллера, если он отсутствует.

...