ASP.NET MVC - выбор из выпадающего списка - частичные представления и привязка модели - PullRequest
5 голосов
/ 04 марта 2011

Я довольно новичок в ASP.NET MVC и пытаюсь найти лучший способ сделать это. Это, вероятно, просто, но я просто хочу сделать все правильно, поэтому я подумал, что спросить.

Допустим, у меня есть такая модель:

Task - Id, Description, AssignedStaffMember

StaffMember - Id, FirstName, LastName

и, на мой взгляд, я хочу создать новое задание. Я делаю строго типизированное представление Razor и могу использовать EditorFor для создания текстовых полей для Description, но как насчет AssignedStaffMember?

Я хочу раскрывающийся список всех текущих сотрудников и могу выбрать один из них, после чего он передается методу действия, который NewTask(string description, StaffMember assignedStaffMember) или это, или я мог бы иметь int для staffId вместо объекта StaffMember и искать его в методе действия.

Каков наилучший способ сделать это? Мне нужно пойти в базу данных, чтобы составить список сотрудников, вот что я подумал:

  1. Создайте частичное представление раскрывающегося списка сотрудников, который будет использоваться несколько раз, и наберите @Html.Action("ListStaff", "Staff") для его вызова. Метод действия тогда имеет

    public ActionResult ListStaff()
    {
        IEnumerable<StaffMember> model = _serviceLayer.GetAllStaff();
        return PartialView(model);
    }
    

    Однако я не уверен, как это будет работать с привязкой модели. Насколько я понимаю, для формы необходимо указать правильное имя для формы, мне нужно передать имя частичному представлению для на элемент, я думаю?

  2. Вместо того, чтобы вызывать контроллер для получения персонала, создайте ViewModel, который содержит мою задачу и коллекцию IEnumerable возможный набор персонала. возможно, отправьте эту информацию для частичного просмотра.

  3. Помощник по HTML?

  4. EditorFor как-то можно использовать?

какой (или есть еще) будет лучше? и как бы я сделал привязку модели?

1 Ответ

18 голосов
/ 04 марта 2011

Вот один из способов сделать это. Создать TaskDetailsViewModel

public class TaskDetailsViewModel
{
    public TaskDetailsViewModel()
    {
        this.Task = new Task();
        this.StaffMembers = new List<StaffMember>();
    }

    public Task Task { get; set; }
    public IEnumerable<StaffMember> StaffMembers { get; set; }
}

В контроллере

public ActionResult Edit(int id)
{
    var task = taskRepository.GetTaskByID(id);

    var taskDetailsViewModel = new TaskDetailsViewModel();

    // Populate taskDetailsViewModel from task and staff

    return View(taskDetailsViewModel);
}

[HttpPost]
public ActionResult Edit(TaskDetailsViewModel taskDetailsViewModel)
{
    if (ModelState.IsValid)
    {
        taskRepository.Save(taskDetailsViewModel.Task);
    }
    else
    {
        // Show Error
    }

    return View(taskDetailsViewModel);
}

В представлении (строго привязано к TaskDetailsViewModel)

@Html.DropDownListFor(model => model.Task.AssignedStaffMember, new SelectList(Model.StaffMembers, "ID", "FirstName", Model.Task.AssignedStaffMember))
@Html.ValidationMessageFor(model => model.Task.AssignedStaffMember)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...