我正在尝试让模型绑定与现有对象一起使用。我对 MVC 很陌生,所以如果方法不好,请原谅我。
我们有一个很大的病人对象。该过程是,首先加载患者,将其存储在会话中,然后跨多个页面进行编辑。我们不希望每次发生模型绑定时都创建一个新实例,因为只编辑了一部分属性。患者处于临时状态,直到发生硬保存,然后患者被保存到数据库中。
我试图利用 asp.net mvc 3 中的模型绑定,但意识到每次发生时都会创建一个新实例。
我不确定如何完成这项任务。
我正在尝试让模型绑定与现有对象一起使用。我对 MVC 很陌生,所以如果方法不好,请原谅我。
我们有一个很大的病人对象。该过程是,首先加载患者,将其存储在会话中,然后跨多个页面进行编辑。我们不希望每次发生模型绑定时都创建一个新实例,因为只编辑了一部分属性。患者处于临时状态,直到发生硬保存,然后患者被保存到数据库中。
我试图利用 asp.net mvc 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 对象。
您可以使用 TryUpdateModel 将 Request.Form 中的数据绑定到现有对象。像这样的东西:
ActionResult SomeControllerAction()
{
var model = Session["Model"]; // get object from model
if(!TryUpdateModel(model))
//return validation
else
// do something
}
我同意@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")])
{
}
重要:我没有测试过这个