表单数据合法性的验证分为客户端验证和服务端验证。纸壳CMS组件中提交表单,当服务端验证失败时如何返回页面并显示错误信息?
在Form中需要主动添加调用@Html.HiddenForCurrentPagePath()
方法:
@using (Html.BeginForm("PostMessage", "MessageHandle", FormMethod.Post))
{
@Html.HiddenForCurrentPagePath()
@Html.LabelFor(m => m.Title)
@Html.TextBoxFor(m => m.Title)
@Html.ValidationMessageFor(m => m.Title)
}
在Controller的Action中,使用ModelState.IsValid
来判断是否通过服务端的验证,并使用RenderRefererPageAttribute
,在验证失败时,渲染出原来的页面,并显示错误信息。
[HttpPost, ValidateAntiForgeryToken, RenderRefererPage]
public IActionResult PostMessage(MessageEntity entity)
{
if (ModelState.IsValid)
{
entity.Status = (int)RecordStatus.InActive;
var result = _messageService.Add(entity);
ModelState.Merge(result);
if (!result.HasViolation)
{
TempData["Message"] = _localize.Get("Thank You for your submit!");
}
}
return View(entity);
}
注意这里的return View(entity);
,这里并不需要创建一个真正的View。并且当验证失败时这个Entity将会传入到对应的WidgetService,这时可将该对象传回到组件模板,用于还原显示用户输入的数据。在以下示例中的FormModel
即是这个entity:
public override object Display(WidgetDisplayContext widgetDisplayContext)
{
if (widgetDisplayContext.FormModel is MessageEntity messageEntity)
{
return messageEntity;
}
return new MessageEntity();
}
刘勋 - 4/16/2021 1:33 AM
体验了,还不错。唯一遗憾的是多选框都没有。列表多选删除只能一个一个删除,很麻烦
回复