MVC:Post:Model绑定和验证

Action对比PageHandler Method

MVC

RazorPage

返回值

默认:ActionResult

默认:void

参数

可以有,值由ASP.NET提供,可以从前端获取

语法上可以有,但无法在方法中使用

MVC是通过Action的参数传递

从客户端传来的数据,都可以被ASP.NET MVC自动转化为Action的参数。

MVC

RazorPage

Action的参数

特性[BindProperty]

数据源可包括:

  • Url Parameter(Request.Query)
  • RoutData,根据route config,对应其{}包裹的值
  • FormData(Request.Form)

Action的方法参数可以是:

  • 简单类型:int/string/bool/enum……,注意使用可空类型代表可选,非可空代表数据一定要有(没有就会报错)
  • 复杂类型:Model绑定,由ASP.NET MVC自动绑定。非常强大!

Model绑定过程中,如果Model的属性是

  • 简单类型:名作为数据源的Key值和匹配
  • 复杂类型:如果数据源的Key值有点号(.)分隔的话,按 . 分隔后从左到右依次匹配:属性、属性的属性、属性的属性的属性……
  • 集合:如果数据源的Key值有方括号([])的话,集合
  1. 截取.前的部分与Model的属性匹配;
  2. 截取.后的部分与Model的属性的属性匹配
  • (演示:checkbox list,略勾选)

Modle验证

PRG模式

直接将ModelState装入TempData之中

if (!ModelState.IsValid) { TempData[Keys.ErrorInModel] = ModelState; return RedirectToAction(nameof(Index)); }

从TempData中取出ModelState,直接Merge

if (TempData[Keys.ErrorInModel] != null) { ModelState.Merge((TempData[Keys.ErrorInModel] as ModelStateDictionary)); }

自定义

可以继承已有ValidationAttribute(同:ASP.NET core)

public static MvcHtmlString LinkFor( this HtmlHelper htmlHelper, Expression> expression) { //取出Model对象 Func func = expression.Compile(); TProperty property = func(htmlHelper.ViewData.Model); //拼凑html元素 string output = $"{property}"; //返回MvcHtmlString对象 return new MvcHtmlString(output); }

你可能感兴趣的:(javascript)