基于通用会话的模型绑定
有时我们需要保留整个模型并将其转移到操作甚至控制器之间。针对此类要求在会话良好解决方案中存储模型。如果我们将它与 MVC 强大的模型绑定功能结合起来,我们就会得到优雅的方式。我们可以通过三个简单步骤创建基于通用会话的模型绑定:
第一步:创建模型绑定器
创建一个模型绑定器本身。我个人在 / Infrastructure / ModelBinders 文件夹中创建了 SessionDataModelBinder 类。 **
using System;
using System.Web.Mvc;
public class SessionDataModelBinder<TModel>
: IModelBinder
where TModel : class
{
private string SessionKey { get; set; }
public SessionDataModelBinder(string sessionKey)
{
if (string.IsNullOrEmpty(sessionKey))
throw new ArgumentNullException(nameof(sessionKey));
SessionKey = sessionKey;
}
public object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
// Get model from session
TModel model = controllerContext
.HttpContext
.Session[SessionKey] as TModel;
// Create model if it wasn't found from session and store it
if (model == null)
{
model = Activator.CreateInstance<TModel>();
controllerContext.HttpContext.Session[SessionKey] = model;
}
// Return the model
return model;
}
}
第二步:注册活页夹
如果我们有如下模型:
public class ReportInfo
{
public int ReportId { get; set; }
public ReportTypes TypeId { get; set; }
}
public enum ReportTypes
{
NotSpecified,
Monthly, Yearly
}
我们可以在 Application_Start 方法中的 Global.asax 中为此模型注册基于会话的模型绑定器 : **
protected void Application_Start()
{
.........
// Model binders.
// Remember to specy unique SessionKey
ModelBinders.Binders.Add(typeof(ReportInfo),
new SessionDataModelBinder<ReportInfo>("ReportInfo"));
}
第三步:使用它!
现在,我们只需在操作中添加参数即可从此模型绑定器中受益 :
public class HomeController : Controller
{
public ActionResult Index(ReportInfo reportInfo)
{
// Simply set properties
reportInfo.TypeId = ReportTypes.Monthly;
return View();
}
public ActionResult About(ReportInfo reportInfo)
{
// reportInfo.TypeId is Monthly now because we set
// it previously in Index action.
ReportTypes currentReportType = reportInfo.TypeId;
return View();
}
}