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 对象。

于 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 回答