一起谈.NET技术,ASP.NET MVC 验证方式(1)

简介:   实现一个简单的验证(C#)  本部分主要目的是说明如何在ASP.NET MVC应用程序中实现验证。例如,将了解如何验证一个表单提交时必填内容的合法性。了解如何应用model state和验证相关的HTML helpers。

  实现一个简单的验证(C#)

  本部分主要目的是说明如何在ASP.NET MVC应用程序中实现验证。例如,将了解如何验证一个表单提交时必填内容的合法性。了解如何应用model state和验证相关的HTML helpers

  理解Model State

  你使用model state,更准确点说是使用model state 字典去表示验证错误。比如,列表一中的Create()方法,在产品类保存入库之前去验证产品类的属性。

  把验证和数据逻辑加到控制类中是违反编程方法的,控制类中应该仅包含程序的流程逻辑。此处是为了便于说明才这样写的。

  列表1---Controllers\ProductController.cs

代码
 
  
//
// POST: /Product/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = " Id " )] Product productToCreate)
{
// Validation logic
if (productToCreate.Name.Trim().Length == 0 )
ModelState.AddModelError(
" Name " , " Name is required. " );
if (productToCreate.Description.Trim().Length == 0 )
ModelState.AddModelError(
" Description " , " Description is required. " );
if (productToCreate.UnitsInStock < 0 )
ModelState.AddModelError(
" UnitsInStock " , " Units in stock cannot be less than zero. " );
if ( ! ModelState.IsValid)
return View();

// Database logic
try
{
_entities.AddToProductSet(productToCreate);
_entities.SaveChanges();
return RedirectToAction( " Index " );
}
catch
{
return View();
}
}

  在列表一中,产品的名称,简介,单价等属性都被验证。如果任何一个属性的验证失败,相应的错误就会被加到model state字典。

  如果在mode state中有任何一个错误,ModelState.IsValid属性都返回的是false。在这种情况下,创建一个新产品的HTML 表单将会再次被显示。否则,如果没有任何错误,新产品就被加到数据库。

  使用Helpers验证

  ASP.NET MVC 包含两个验证Helper:Html.ValidationMessage()和Html.ValidationSummary()。使用这两个方法在视图类中去显示错误信息。

  在ASP.NET MVC框架自动产生的视图中使用Html.ValidationMessage()和Html.ValidationSummary()。按照如下步骤产生Create视图:

  1. 在产品控制类右键单击Create()方法,选择Add View选项(如图一)。

  2. 在Add view对话框中,选中Create a strongly-typed view (如图2)。

  3. 从View data class下拉列表中,选择Product类。

  4. 从view content下拉列表中,选择Create.

  5. 单击add按钮。

  确保在添加视图之前重新生成解决方案,否则,在View data class下拉列表框中不会出现类的列表。

  图1:

  图2:

  在完成这些步骤之后,得到列表二的Create视图。

  列表2---views\Product\Create.aspx

代码
 
  
<% @ Page Title = "" Language = " C# " MasterPageFile = " ~/Views/Shared/Site.Master " Inherits = " System.Web.Mvc.ViewPage<MvcApplication1.Models.Product> " %>

< asp:Content ID ="Content1" ContentPlaceHolderID ="head" runat ="server" >
< title > Create </ title >
</ asp:Content >

< asp:Content ID ="Content2" ContentPlaceHolderID ="MainContent" runat ="server" >

< h2 > Create </ h2 >

<% = Html.ValidationSummary() %>

<% using (Html.BeginForm()) { %>

< fieldset >
< legend > Fields </ legend >
< p >
< label for ="Name" > Name: </ label >
<% = Html.TextBox( " Name " ) %>
<% = Html.ValidationMessage( " Name " , " * " ) %>
</ p >
< p >
< label for ="Description" > Description: </ label >
<% = Html.TextBox( " Description " ) %>
<% = Html.ValidationMessage( " Description " , " * " ) %>
</ p >
< p >
< label for ="Price" > Price: </ label >
<% = Html.TextBox( " Price " ) %>
<% = Html.ValidationMessage( " Price " , " * " ) %>
</ p >
< p >
< label for ="UnitsInStock" > UnitsInStock: </ label >
<% = Html.TextBox( " UnitsInStock " ) %>
<% = Html.ValidationMessage( " UnitsInStock " , " * " ) %>
</ p >
< p >
< input type ="submit" value ="Create" />
</ p >
</ fieldset >

<% } %>

< div >
<% = Html.ActionLink( " Back to List " , " Index " ) %>
</ div >

</ asp:Content >

  在列表2中,Html.ValidationSummary()被HTML表单自动调用。它被用来去显示一组验证错误信息。它显示的一个具有圆点标记的错误信息列表。

  Html.ValidationSummary()被Html表单的对应部分调用。它用来在对应表单项的右边显示一个错误信息,在列表2中的情况,如果有一个错误它就会显示*号。

  图3中,当表单中对应项为空或值无效时验证不过,提示的信息。

  验证错误出现的样式是可以修改的。

  有三个样式表类用来控制验证错误信息的样式:

  1.Input-validation-err

  2.Field-validation-error

  3.Validation-summary-errors

  可以通过修改Content文件夹下的Site.css文件来修改验证错误的样式。

  HtmlHelper类包含了只读静态属性,ValidationInputCssClassName, ValidationFieldCssClassName, and ValidationSummaryCssClassName。

  预定义绑定验证和已绑定验证

  如果你提交这个表单去创建一个新产品,输入一个无效字段,和空字段,这时你将会得到如图4所示的验证信息。这些错误信息是从哪里来的?

  图4

  实际上验证信息有两种类型--在表单字段被绑定到类之前和之后产生的错误信息。也就是,预绑定验证错误和已绑定验证错误。

  在列表1中的Product控制器的Create()方法接受一个产品类的实列。如下所示:

 
 
public ActionResult Create([Bind(Exclude = " Id " )] Product productToCreate)

  Create表单中的字段值是通过model binder绑定到productToCreate类的。当它不能把表段字段的值绑定到表单属性的时候,它就会自动的把一个错误信息加到model state中。

  默认的model binder不能够把字符串“apple“绑定到产品类的价格属性上。不能把一个字符绑定到数值型属性上。因此,model biner把一个错误信息加到了model state.

  默认的model binder也不能把一个null值绑定到一个不接受null值的属性。

  如果想要自定义一些预绑定错误信息,这时需要为这些信息创建资源。

  总结:

  本部分描述了一个基本固定的ASP.NET MVC的验证方式。了解了如何使用model stateHTML helper。也讨论了预定义绑定和已绑定验证的区别。在以后部分将讨论把验证代码从控制部分转移到model部分。

目录
相关文章
|
3天前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
3天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
9 0
|
26天前
|
开发框架 搜索推荐 前端开发
【.NET全栈】ASP.NET开发Web应用——Web部件技术
【.NET全栈】ASP.NET开发Web应用——Web部件技术
|
3天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3天前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
7天前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
35 0
|
1月前
|
开发框架 JSON .NET
|
2月前
|
机器学习/深度学习 JSON 测试技术
CNN依旧能战:nnU-Net团队新研究揭示医学图像分割的验证误区,设定先进的验证标准与基线模型
在3D医学图像分割领域,尽管出现了多种新架构和方法,但大多未能超越2018年nnU-Net基准。研究发现,许多新方法的优越性未经严格验证,揭示了验证方法的不严谨性。作者通过系统基准测试评估了CNN、Transformer和Mamba等方法,强调了配置和硬件资源的重要性,并更新了nnU-Net基线以适应不同条件。论文呼吁加强科学验证,以确保真实性能提升。通过nnU-Net的变体和新方法的比较,显示经典CNN方法在某些情况下仍优于理论上的先进方法。研究提供了新的标准化基线模型,以促进更严谨的性能评估。
90 0
|
2月前
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
|
2月前
|
Linux C# C++
【.NET Developer】创建ASP.NET Core Blazor项目并打包为Linux镜像发布到Azure应用服务
本文介绍了如何使用VS2019和.NET框架创建一个Blazor应用,并将其部署到Azure应用服务。首先,Blazor是一个使用C#而非JavaScript构建交互式Web UI的框架,支持共享服务器和客户端应用逻辑,以及与Docker和Azure集成。任务包括创建Blazor项目,配置Dockerfile为Linux容器,本地测试,发布到Azure Container Registry (ACR),然后在Azure App Service for Container上部署。在部署过程中,需确保Docker设置正确,开启ACR的Admin访问权限,并监控镜像拉取和容器启动日志。