我的项目中有一个日志控制器,它从javascript客户端获取日志数据并发送到服务器。
Log Model ils就是这样。
public class Log
{
public string Event { get; set; }
public string Message { get; set; }
public DateTime Date { get; set; }
public string Username { get; set; }
}
我的控制器动作是这样的。
[HttpPost]
public JsonResult Save(Log log)
{
log.Username = User.Identity.Name;
log.Date = DateTime.now;
return Json(new { message = "ok" }, JsonRequestBehavior.AllowGet);
}
当用户发送日志数据时,我需要设置用户名和日期。还有另一种模式绑定方式吗?自动设置日志的context.username和日期时间。
答案 0 :(得分:1)
IModelBinder
是首选方式。您实现接口并在Global.asax文件中注册它
ModelBinders.Binders.Add(typeof(Log), new LogModelBinder());
我不喜欢这种方法,你必须要知道这种类型的自定义模型绑定器在某个地方实现,如果你忘了它就会引起混乱,或者你有一个新的开发人员在项目和模型上工作开始表现得很奇怪。什么是改变对象是不够明显的。
我喜欢在控制器本身中实现所有自定义逻辑。您可以覆盖OnActionExecuting
并在那里注入属性,更好的是,拥有所有控制器继承的BaseController
并在那里执行自定义逻辑。
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
object model = filterContext.ActionParameters
.TryGetValue("model", out model)
? model : null;
if (model != null)
{
var logModel = model as Log;
if (logModel != null)
{
logModel.Date = DateTime.Now;
logModel.Username = filterContext.HttpContext.User.Identity.Name;
}
}
}