在写毕业设计过程中遇到了一个问题,关于模型过滤问题。
这个是默认的过滤方法,他会在进入方法前进行模型验证,如果验证失败会返回原页面,但是在返回原页面之后,会导致原页面的model,ViewBag为null,直接报错。
public class ValidateModelStateAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.Controller.ViewData.ModelState.IsValid)
{
filterContext.Result = new ViewResult
{
ViewData = filterContext.Controller.ViewData,
TempData = filterContext.Controller.TempData
};
}
base.OnActionExecuting(filterContext);
}
}
原因是这个过滤方法的Result里只包含了错误信息,而没有包含原来的页面数据。
这个过滤方法是模版原有的,改动的话,会导致其他地方报错。
所以只能在控制器的方法里面改动。
这个是改动之前的方法代码。
<span style="white-space:pre"> </span>/// <summary>
/// 修改-任务总概
/// </summary>
/// <param name="title"></param>
/// <returns></returns>
[HttpPost]
[ValidateModelState]
public ActionResult Edit(T_TaskTitle title)
{
var model = _manageService.GetTaskTitleById(title.Id);
model.PlanTime = Convert.ToDateTime(title.VPlanTime);
model.VPlanTime = title.VPlanTime;
model.AttributeId = title.AttributeId;
model.Remark = title.Remark;
_manageService.CreateOrEditTaskTitle(model);
//关闭模态窗
return Content("<script> parent.location.reload(1);</script>");
}
这个是改动之后的方法代码,完美解决了这个问题。
<span style="white-space:pre"> </span>/// <summary>
/// 修改-任务总概
/// </summary>
/// <param name="collection"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Edit(FormCollection collection)
{
T_TaskTitle title = new T_TaskTitle();
if (!TryUpdateModel(title))
{
var attributeid = _manageService.GetTaskTitleById(title.Id).AttributeId;
ViewBag.TypeId = _manageService.GetAttributeById(attributeid).TypeId;
return View("Edit");
}
var model = _manageService.GetTaskTitleById(title.Id);
model.PlanTime = Convert.ToDateTime(title.VPlanTime);
model.VPlanTime = title.VPlanTime;
model.AttributeId = title.AttributeId;
model.Remark = title.Remark;
_manageService.CreateOrEditTaskTitle(model);
//关闭模态窗
return Content("<script> parent.location.reload(1);</script>");
}
最关键的方法是, TryUpdateModel(),这个方法能将提交的数据更新到实体类中,自动验证字段是否有效,从而保证提交的数据的有效性。
以上。