0

モデルバインディングを既存のオブジェクトで機能させるようにしようとしています。私はMVCにかなり慣れていないので、アプローチが悪い場合はご容赦ください。

大きな患者オブジェクトがあります。プロセスは、最初に患者がロードされ、セッションに保存されてから、複数のページにわたって編集されます。プロパティのサブセットのみが編集されているため、モデルのバインドが発生するたびに新しいインスタンスを作成する必要はありません。ハードセーブが発生するまで患者は一時的な状態で生活し、その後患者はデータベースに保存されます。

asp.net mvc 3でモデルバインディングを利用しようとしていますが、発生するたびに新しいインスタンスが作成されることに気付きました。

このタスクを実行する方法がわかりません。

4

3 に答える 3

3

この問題を解決するために、次のようなカスタムモデルバインダーを作成します。

public class PatientModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var patientId = int.Parse(bindingContext.ValueProvider.GetValue("patientId").AttemptedValue);

        var session = HttpContext.Current.Session;
        Patient patient;

        //Add logic to search session for the right patient here.

        return patient;
    }
}

次に、次の行を使用して、global.asaxファイルのApplication_StartメソッドにModelBinderを接続できます。

System.Web.Mvc.ModelBinders.Binders.Add(typeof(Patient), new PatientModelBinder());

次に、patientIdを受け取るアクションはすべて、セッションからプルされたPatientのhyrdratedオブジェクトを取得します。

于 2012-10-03T19:27:35.050 に答える
1

TryUpdateModelを使用して、Request.Formのデータを既存のオブジェクトにバインドできます。このようなもの:

ActionResult SomeControllerAction()
{
    var model = Session["Model"]; // get object from model
    if(!TryUpdateModel(model))
       //return validation
    else
       // do something
}
于 2012-10-03T21:53:58.000 に答える
0

@Jeffreyがカスタムモデルバインダーを使用することに同意しますが、実装する代わりにIModelBinder、クラスから継承しDefaultModelBinder、メソッドのみをオーバーライドしますCreateModel

このCreateModelメソッドは、Modelクラスの新しいインスタンスを毎回インスタンス化するメソッドであるため、そのメソッドでは、セッションに患者インスタンスがあるかどうかを確認し、ある場合はそれを返します。

  public class CustomModelBinder: DefaultModelBinder
  {
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, System.Type modelType)
    {
      // check if the session has patient instance and if yes return that.

      return base.CreateModel(controllerContext, bindingContext, modelType);
    }
  }

このモデルバインダーを登録した後、属性を使用してモデルを更新するために含める必要のあるプロパティをアクションメソッドに指定しBindます。

元。

public ActionResult UpdatePatientNameOnly(Patient patient[Bind(Include="First, Last")])
{
}

public ActionResult UpdatePatientAge(Patient patient[Bind(Include="Age")])
{    
}

重要:私はこれをテストしていません

于 2012-10-04T14:45:46.843 に答える