0

次のシナリオがあります。

  1. Edit/Employee ビューに Entity Framework エンティティ (Employee) からのモデルが取り込まれています
  2. Edit/Employee から Save/Employee コントローラ アクションに投稿します。Save/Employee アクションは、プロパティとして Employee を持つ別のタイプ (EmployeeSave) を想定しています。

これは 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 クラスの両方を解決できます。

4

2 に答える 2

1

ここで使用する必要があるかもしれませんBindAttribute。ビューにのプロパティが含まれている場合、このようEmployeeSaveViewModelEmployee名前が付けられています(私はプロパティ名を作成しました)

<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);
}
于 2011-08-11T12:09:14.547 に答える
0

編集したデータを HttpPost を処理する Edit アクションに戻すことで解決できます。内部で EmployeeSave オブジェクトを作成し、その Employee プロパティに、編集アクションに返された Employee の値を割り当てます。EmployeeSave オブジェクトを渡して Save アクションを呼び出します。

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

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

    return View("Save", employeeSave);
}

別の方法は、Employee の代わりに EmployeeSave をモデルとして使用することです。

于 2011-08-11T11:42:17.520 に答える