Как связать свойство модели с DefaultModelBinder - ASP.NET MVC2 - PullRequest
0 голосов
/ 11 августа 2011

У меня есть следующий сценарий.

  1. У меня есть представление Edit / Employee, заполненное моделью из сущности Entity Framework (Employee)
  2. Я отправляю сообщение из раздела Редактировать / Сотрудник в действие контроллера Сохранить / Сотрудник. Действие «Сохранить / Сотрудник» ожидает другого типа (EmployeeSave), для которого в качестве свойства * Employee

Это метод Edit / Employee

    public ActionResult Edit(EmployeesEdit command)
    {
        var employee = command.Execute();
        if (employee != null)
        {
            return View(employee);
        }
        return View("Index");
    }

Это метод Save / Employee

  public ActionResult Save(EmployeesSave command)
    {
        var result = command.Execute();
        if (result)
        {
            return View(command.Employee);
        }
        return View("Error");
    }

Это класс EmployeeSave

public class EmployeesSave
{
    public bool Execute()
    {
        // ... save the employee   
        return true;

    }
    //I want this prop populated by my model binder
    public Employee Employee { get; set; }  
}

MVC DefaultModelBinder может разрешать классы Employee и EmployeeSave.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Возможно, вам придется использовать BindAttribute здесь.Если ваше представление содержит свойства EmployeeSaveViewModel и Employee, названные так (я составил имена свойств)

<input type="text" name="EmployeeSaveViewModel.Property1" />
<input type="text" name="EmployeeSaveViewModel.Employee.Name" />
<input type="text" name="EmployeeSaveViewModel.Employee.SomeProperty" />

Тогда ваше действие может выглядеть так:

[HttpPost]
public ActionResult Save([Bind(Prefix="EmployeeSaveViewModel")] 
                         EmployeeSaveViewModel vm)
{
    if(ModelState.IsValid)
    {
        // do something fancy
    }

    // go back to Edit to correct errors
    return View("Edit", vm);
}
0 голосов
/ 11 августа 2011

Вы можете решить эту проблему, передав отредактированные данные обратно в действие Edit, которое обрабатывает HttpPost. Внутри создайте объект EmployeeSave и присвойте его свойству Employee значение Employee, возвращаемое в действие Edit. Вызовите действие Сохранить, передав объект EmployeeSave.

[HttpGet]
public ActionResult Edit()
{
    return View();
}

[HttpPost]
public ActionResult Edit(Employee employee)
{
    EmployeeSave employeeSave = new EmployeeSave { Employee = employee };

    return View("Save", employeeSave);
}

Другим методом будет использование EmployeeSave вместо Employee в качестве модели.

...