Как связать свойство модели с DefaultModelBinder - ASP.NET MVC2
У меня есть следующий сценарий.
- Я имею представление Edit / Employee, заполненное моделью из сущности Entity Framework (Employee)
- Я отправляю сообщение из раздела Редактировать / Сотрудник в действие контроллера Сохранить / Сотрудник. Действие Сохранить / Сотрудник ожидает другого типа (EmployeeSave), в котором свойство 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 ответа
Возможно, вам придется использовать 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);
}
Вы можете решить эту проблему, передав отредактированные данные обратно в действие 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 в качестве модели.