当前位置: 首页 > news >正文

mvc---- 前端校验

首先解决 Ajax.BeginFor异步提交表单,给表单添加样式的问题。不能直接用class属性,网上找了很多都是用ClassName,经过测试不管用,看源代码发现生成的是ClassName而非class,其实很简单,加一个@符号即可,即@class="";

我们知道,LabelFor是不能添加class样式的,这个需自行拓展,反编译后自行拓展了一个给LabelFor添加样式的方法,代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Linq.Expressions;
 7 
 8 namespace System.Web.Mvc
 9 {
10     public static class MyLabelExtensions
11     {
12         public static MvcHtmlString MyLabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string className)
13         {
14             return LabelHelper(html, ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData), ExpressionHelper.GetExpressionText(expression), className);
15         }
16 
17         private static MvcHtmlString LabelHelper(HtmlHelper html, ModelMetadata metadata, string htmlFieldName, string className = "")
18         {
19             string txtLabel = metadata.DisplayName ??
20                               (metadata.PropertyName ?? htmlFieldName.Split(new char[] {','}).Last<string>());
21             if (string.IsNullOrEmpty(className))
22             {
23                 return MvcHtmlString.Empty;
24             }
25             TagBuilder tagBuilder = new TagBuilder("label");
26             tagBuilder.Attributes.Add("for", TagBuilder.CreateSanitizedId(html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(htmlFieldName)));
27             tagBuilder.Attributes.Add("class", className);
28             tagBuilder.SetInnerText(txtLabel);
29             return new MvcHtmlString(tagBuilder.ToString(TagRenderMode.Normal));
30         }
31     }
32 }

先看效果:

前端JS代码:

@{Layout = null;
}
@model MvcApp.DataTable.Controllers.MyTest
<!DOCTYPE html><html>
<head><title>Index</title><link href="../../JQueryValidate/assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" /><link href="../../JQueryValidate/style.css" rel="stylesheet" type="text/css" /><script src="../../JQueryValidate/assets/js/jquery-1.7.1.min.js" type="text/javascript"></script><script src="../../JQueryValidate/assets/js/jquery.validate.js" type="text/javascript"></script><script type="text/javascript" language="javascript" charset="gb2312">$(document).ready(function() {$('#contact-form').validate({rules: {Name: {minlength: 2,required: true,remote: {url: "/Home/GetSameNameCount/",type: "post",data: {Name: function () {return $('#Name').val();}}}},Email: {required: true,email: true},Subject: {minlength: 2,required: true},Password: {required: true,minlength: 5},Password2: {required: true,minlength: 5,equalTo: "#Password"},Address: {minlength: 2,required: true}},messages: {Name: {minlength: "请输入长度至少2位",required: "名称必须的必!",remote: "姓名已存在,请输入其他名称"},Email: {required: "请输入邮箱地址",email: "邮箱格式有误,请仔细检查"},Subject: {minlength: "请输入长度至少2位",required: "Must Write Subject Please"},Password: {required: "请输入密码",minlength: "密码长度至少为5位数"},Password2: {required: "请再次输入密码",minlength: "密码长度至少为5位数",equalTo: "两次密码输入不一致"},Address: {minlength: "请输入长度至少2位",required: "消息不能为空撒"}},highlight: function (element) {$(element).closest('.control-group').removeClass('success').addClass('error');},success: function (element) {element.text('OK!').addClass('valid').closest('.control-group').removeClass('error').addClass('success');}});});function afterSave() {}</script>
</head><body>@using (Ajax.BeginForm("SetRecord", "Home", new AjaxOptions { UpdateTargetId = "ajaxResult", HttpMethod = "POST", InsertionMode = InsertionMode.Replace, OnSuccess = "afterSave" }, new { id = "contact-form", @class = "form-horizontal" })){<div class="control-group">@Html.MyLabelFor(model => model.Name, "control-label")<div class="controls">@Html.TextBoxFor(model => model.Name, new { @class="input-xlarge" })</div></div><div class="control-group">@Html.MyLabelFor(model => model.Email, "control-label")<div class="controls">@Html.TextBoxFor(model => model.Email, new { @class="input-xlarge" })</div></div><div class="control-group">@Html.MyLabelFor(model => model.Subject, "control-label")<div class="controls">@Html.TextBoxFor(model => model.Subject, new { @class="input-xlarge" })</div></div><div class="control-group">@Html.MyLabelFor(model => model.Password, "control-label")<div class="controls">@Html.TextBoxFor(model => model.Password, new { @class = "input-xlarge", type = "password" })</div></div><div class="control-group">@Html.MyLabelFor(model => model.Password2, "control-label")<div class="controls">@Html.TextBoxFor(model => model.Password2, new { @class = "input-xlarge", type = "password" })</div></div><div class="control-group">@Html.MyLabelFor(model => model.Address, "control-label")<div class="controls"><textarea class="input-xlarge" name="Address" id="Address" rows="3"></textarea></div></div><div class="form-group">@Html.MyLabelFor(model => model.Sex, "control-label")    @Html.DropDownListFor(model => model.Sex, new SelectList(ViewBag.SexList, "strKey", "strValue", 1), "--请选择--", new { style = "width: 280px;" })</div><div class="form-actions"><button type="submit" class="btn btn-primary">提交</button><button type="reset" class="btn">重置</button></div>}</body>
</html>

  后台C#代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 using System.Runtime.Serialization;
 7 using System.ComponentModel;
 8 
 9 namespace MvcApp.DataTable.Controllers
10 {
11     public class HomeController : Controller
12     {
13         //
14         // GET: /Home/
15 
16         public ActionResult Index()
17         {
18             ViewBag.SexList = new List<KeyValue>
19             {
20                 new KeyValue("0",""),new KeyValue("1","")
21             };
22             return View();
23         }
24 
25         [HttpPost]
26         public ActionResult SetRecord(MyTest t)
27         {
28             string m = t.Name;
29             return Content("ok");
30         }
31 
32         [HttpPost]
33         public ActionResult GetSameNameCount()
34         {
35             string Name = Request["Name"];
36             bool isExistName = true;//验证通过
37             if (Name == "huangzhong")
38             {
39                 isExistName = false;//用户名已存在,验证不通过
40             }
41             System.Web.Script.Serialization.JavaScriptSerializer javascriptserializer = new System.Web.Script.Serialization.JavaScriptSerializer();
42             return Content(javascriptserializer.Serialize(isExistName));
43         }
44     }
45     [DataContract]
46     public class MyTest
47     {
48         [DataMember]
49         [DisplayName("姓名")]
50         public string Name { get; set; }
51         [DataMember]
52         [DisplayName("邮箱")]
53         public string Email { get; set; }
54         [DataMember]
55         [DisplayName("主题")]
56         public string Subject { get; set; }
57         [DataMember]
58         [DisplayName("地址")]
59         public string Address { get; set; }
60         [DataMember]
61         [DisplayName("密码")]
62         public string Password { get; set; }
63         [DataMember]
64         [DisplayName("确认密码")]
65         public string Password2 { get; set; }
66         [DataMember]
67         [DisplayName("性别")]
68         public string Sex { get; set; }
69     }
70 
71     public class KeyValue
72     {
73         public string strKey { get; set; }
74         public string strValue { get; set; }
75         public KeyValue(string iv, string it)
76         {
77             this.strKey = iv;
78             this.strValue = it;
79         }
80     }
81 }

 

http://www.jsqmd.com/news/973167/

相关文章:

  • 计算机界的“高考“:软考高项是一场持久战
  • 从安装到实战:手把手教你用Nsight Systems (nsys) 优化一个向量加法CUDA程序
  • Unity游戏翻译神器:XUnity.AutoTranslator新手入门到精通
  • 深圳公明眼镜店哪个好
  • 2026年众智商学院400热线怎么核对?报名咨询和班期确认入口 - 众智商学院职业教育
  • Hadoop 3.x 数据安全实战:手把手教你配置HDFS透明加密与KMS(附避坑指南)
  • 哪家南昌全屋定制品牌靠谱?2026年6月推荐TOP5对比空间利用评测案例选择指南 - 品牌推荐
  • STC89C52等51单片机直连DHT22的可烧录工程合集(含DHT11/DHT21兼容代码)
  • 多维聚合实战:ROLAP下数据立方体的切片、钻取与动态计算
  • 2025-2026年北京管道疏通公司推荐:五大评测专业指南市政管网养护选择指南价格 - 品牌推荐
  • R语言实战:用lm()和手动计算两种方法搞定回归模型的MSE评估(附mtcars数据集案例)
  • 视频理解新范式:TimeSformer如何用‘分而治之’的注意力机制,在Something-Something数据集上超越CNN?
  • 这款免费AI工具,让你轻松成为编程大师
  • 从PCIe 5.0到SR-IOV:一张图看懂现代数据中心网卡的硬件虚拟化原理
  • 2026年石家庄空调移机公司推荐 大为搬家16年专业经验值得信赖 - 本地品牌推荐
  • 你的Docker容器初始化慢?可能是没搞懂/docker-entrypoint-initdb.d目录的正确用法
  • 中医粉常见八大逻辑误区 – 爱自然 爱科技
  • 千万不能错过!这家两联供产品厂家为何让同行都震惊了?
  • TensorFlow 2深度学习操作系统:从API调用到系统掌控
  • 2026 年五款免费 PDF 转换器无水印实测与选型指南
  • 给自动驾驶算法工程师的仿真利器:用MATLAB Simulink控制UE4虚拟环境完整流程
  • 从一次金额计算Bug说起:手把手教你用BigDecimal.compareTo()做安全的数值比较
  • 2026 安徽马鞍山市|本地人必选旧房改造・墙面刷新・局部装修 3 家正规企业精选 + 避坑攻略 - 本地便民网
  • 哪家北京房产纠纷律师靠谱?2026年6月推荐TOP5对比合同陷阱评测案例适用场景专业 - 品牌推荐
  • C51单片机驱动TM1628控制多位数码管的完整工程包(含Keil可编译源码与调试文件)
  • 打卡信奥刷题(3369)用C++实现信奥题 P9691 [GDCPC 2023] Base Station Construction
  • 从词性标注到命名实体识别:手把手教你用pyltp的Postagger和NamedEntityRecognizer构建信息提取小工具
  • Windows下用venv创建Flask虚拟环境的完整指南
  • 2026年6月北京十大装修公司推荐:专业评测排名选择指南价格 - 品牌推荐
  • SuperMap iDesktop进阶技巧:没有公开参数?手把手教你从已有数据‘炼’出坐标系转换秘籍