概念/述语
从这里开始
数据库
开发入门
程序扩展
使用介绍
其它

表单数据合法性的验证分为客户端验证和服务端验证。纸壳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)
}

参考:Widget.Message.cshtml

控制器

在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);
}

参考:MessageHandleController.cs

注意这里的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();
}

参考:MessageWidgetService.cs


  • 刘勋 - 4/16/2021 1:33 AM

    体验了,还不错。唯一遗憾的是多选框都没有。列表多选删除只能一个一个删除,很麻烦

    回复

微信公众号