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