MVC 表单的服务器端验证。

szjarvis 2013-05-18 05:24:05
view中使用的不是强类型,Action如何验证并返回一个信息?

js 验证不能取代服务器端,因为浏览器可能会禁用js.

view使用的不是强类型,ModelState.AddModelError好像就不好使了。

高手们是怎么做服务器端 验证的。
...全文
307 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
szjarvis 2013-05-19
  • 打赏
  • 举报
回复
谢谢,原来就是提交的Action名错了。
引用 9 楼 soladyk 的回复:
问题1: 楼主view的名称是什么? 问题2: Html.BeginForm("ChangePassword", "AdminUser", FormMethod.Post, new { id = "frm1" })) 会进入AdminUserController的Action [HttpPost] ChangePassword 但我没有看到这个方法…… 楼主确定你代码是对的,点提交后能进入ChangePassword的断点?
xml111024 2013-05-19
  • 打赏
  • 举报
回复
向强类型上靠,新增或者扩充原有的强类型,可以方便很多。
szjarvis 2013-05-19
  • 打赏
  • 举报
回复
奇怪,为什么我的不行呢,我把完整代码贴出来,帮我看看哪里有错。 View:

@model Zjgcxx.Model.Web_User

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <title>修改密码</title>
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" />
    <script src="../../Scripts/jquery-1.8.3.min.js" type="text/javascript"></script>

    <script type="text/javascript">
        $(document).ready(function () {
        });

        function chkFrm() {
            var pasw0 = $("#txtPassword").val();
            var pasw1 = $("#txtPasw1").val();
            var pasw2 = $("#txtPasw2").val();

            if (pasw0 == "") {
                alert("请输入原密码!");
                $("#txtPassword").focus();
                return false;
            }
            if (pasw1.length < 3) {
                alert("新密码长度不足!");
                $("#txtPasw1").focus();
                return false;
            }
            if (pasw1 != pasw2) {
                alert("新密码不一致!");
                $("#txtPasw2").focus();
                return false;
            }

            return true;
        }
    </script>
</head>
<body>
<center>

    <br /><p style="font-size:18px; font-weight:bold;">修 改 密 码</p><br />
    
    @using (Html.BeginForm("ChangePassword", "AdminUser", FormMethod.Post, new { id = "frm1" }))
    {
        @Html.ValidationSummary()
        @*@Html.HiddenFor(model => model.user_id)*@
        <table border="1" cellpadding="0" cellspacing="0" class="TabStyle" width="500">
            <tr><td style="width:80px;">原 密 码:</td>
            <td>@Html.Password("txtPassword", "", new { style = "width:200px;" })
            @Html.ValidationMessage("txtPassword")
            </td>
            </tr>
            <tr><td>新 密 码:</td>
            <td>@Html.Password("txtPasw1", "", new { style = "width:200px;" })
            @Html.ValidationMessage("txtPasw1")
            </td>
            </tr>
            <tr><td>确认密码:</td>
            <td>@Html.Password("txtPasw2", "", new { style = "width:200px;" })
            @Html.ValidationMessage("txtPasw2")
            </td>
            </tr>
        </table>
        
        <br />
        <input type="submit" value="提 交" @*onclick="return chkFrm();"*@ 
            style="width:70px;" class="button0" onmouseover="this.className='button0_on'" onmouseout="this.className='button0'" />
    }
    

    <br />
</center>
</body>
</html>
Cotroller:

        public ActionResult ChangePassword()
        {
            Web_User uModel = getLandUser();
            return View(uModel);
        }


        [HttpPost]
        public ViewResult saveChange()
        {
            string userid = Request["user_id"];
            string oldPasw = Request["txtPassword"];
            string newPasw1 = Request["txtPasw1"];
            string newPasw2 = Request["txtPasw2"];
            oldPasw = Tools.ToMD5(oldPasw);
            Web_User uModel = null;

            #region
            if (newPasw1.Length < 3)
            {
                ModelState.AddModelError("txtPasw1", "密码长度必须大于3个字符~~");
            }
            if (ModelState.IsValid)
            {
                return View("Thanks.");
            }
            else
            {
                return View();
            }


            if (!newPasw1.Equals(newPasw2))
            {
                ModelState.AddModelError("txtPasw2", "新密码不一致~~");
                return View();
            }
            if (userid != null)
            {
                uModel = userBLL.Get(userid);
                if (uModel != null)
                {
                    if (oldPasw != uModel.user_pasw)
                    {
                        ModelState.AddModelError("txtPassword", "原密码不正确~~");
                        return View();
                    }
                    else
                    {
                        newPasw1 = Tools.ToMD5(newPasw1);
                        uModel.user_pasw = newPasw1;
                        int flag = userBLL.Update(uModel);
                        if (flag > 0)
                        {
                            ModelState.AddModelError("lbMsg", "密码修改成功!");
                            return View();
                        }
                    }
                }
                else
                {
                    ModelState.AddModelError("lbMsg", "用户身份无效~~");
                    return View();
                }
            }
            else
            {
                ModelState.AddModelError("lbMsg", "用户身份无效~~");
                return View();
            }
            #endregion

            return View();
        }
熊猫无敌 2013-05-19
  • 打赏
  • 举报
回复
最后一句打错了,是saveChange()
熊猫无敌 2013-05-19
  • 打赏
  • 举报
回复
问题1: 楼主view的名称是什么? 问题2: Html.BeginForm("ChangePassword", "AdminUser", FormMethod.Post, new { id = "frm1" })) 会进入AdminUserController的Action [HttpPost] ChangePassword 但我没有看到这个方法…… 楼主确定你代码是对的,点提交后能进入ChangePassword的断点?
熊猫无敌 2013-05-18
  • 打赏
  • 举报
回复
楼主这样是可以的啊……
<body>
    @using (Html.BeginForm()) {
        @Html.ValidationSummary()
        <p>Your name: @Html.Password("name") </p>
        @Html.ValidationMessage("name")
        <input type="submit" value="Submit RSVP" />
    }
</body>
        
[HttpPost]
        public ViewResult RsvpForm(string name)
        {
            if (string.IsNullOrEmpty(name))
            {
                ModelState.AddModelError("name", "Please enter your name");
            }

            if (ModelState.IsValid)
            {
                return View("Thanks");
            }
            else
            {
                // there is a validation error - redisplay the form
                return View();
            }
        }
熊猫无敌 2013-05-18
  • 打赏
  • 举报
回复
加上@Html.ValidationSummary()试试 @using (Html.BeginForm()) { @Html.ValidationSummary() <p>Your name: @Html.TextBox(“name”) </p> <input type="submit" value="Submit RSVP" /> } @Html.ValidationMessage("txtPasw1")没试过
szjarvis 2013-05-18
  • 打赏
  • 举报
回复
string userid = Request["user_id"]; string oldPasw = Request["txtPassword"]; string newPasw1 = Request["txtPasw1"]; if (newPasw1.Length < 3) { ModelState.AddModelError("txtPasw1", "密码长度必须大于3个字符~~"); return View(); } View: @Html.Password("txtPasw1", "", new { style = "width:200px;" }) @Html.ValidationMessage("txtPasw1") 我是这样验证的,可是ModelState.AddModelError没反应。 还需要写其它什么吗?
熊猫无敌 2013-05-18
  • 打赏
  • 举报
回复
1. 站把JS禁了不工作,那是那些网站设计不合理,JS写得烂 高水平的网站是完全可以做到JS分离还能work的 2. 主的情况应该是少数情况,甚至可以说是一个不良设计 如果不是强类型,还是可以在controller端的Action里验证 if (string.IsNullOrEmpty(name)) { ModelState.AddModelError("name", "Please enter your name"); } if (ModelState.IsValid) { XXX } else { return View(); } 从源代码看来,我觉得即使不是一个强类型,这个还是会work的(实际上也是,我简单试了下) 只要key的名字和后面非强类型的string匹配 public void AddModelError(string key, string errorMessage) 从这里和里面的代码可见,无论强类型,还是弱类型,Property都会转化为string作为key 所以楼主说弱类型AddModelError不work也是不对的
newtee 2013-05-18
  • 打赏
  • 举报
回复
禁用js不给他提交 很多网站你把js给禁了还会有用吗? 不是强类型就自己验证呗 然后return json
moonwrite 2013-05-18
  • 打赏
  • 举报
回复
var username=Request.Params["username"]; 然后就判断username的长度什么的~ 不过我还是比较推荐定义一个实体类
An outstanding author team presents the ultimate Wrox guide to ASP.NET MVC 4 Microsoft insiders join giants of the software development community to offer this in-depth guide to ASP.NET MVC, an essential web development technology. Experienced .NET and ASP.NET developers will find all the important information they need to build dynamic, data-driven websites with ASP.NET and the newest release of Microsoft's Model-View-Controller technology. Featuring step-by-step guidance and lots of code samples, this guide gets you started and moves all the way to advanced topics, using plenty of examples. Designed to give experienced .NET and ASP.NET programmers everything needed to work with the newest version of MVC technology Expert author team includes Microsoft ASP.NET MVC insiders as well as leaders of the programming community Covers controllers, views, models, forms and HTML helpers, data annotation and validation, membership, authorization, security, and routing Includes essential topics such as Ajax and jQuery, NuGet, dependency injection, unit testing, extending MVC, and Razor Includes additional real-world coverage requested by readers of the previous edition as well as a new case study example chapter 下面是上一版书的中文介绍 《ASP.NET MVC 3 高级编程》主要内容是描述视图的概念,探讨Razor语法、NuGet、单元测试等,解释控制器在MVC框架中的作用,以及模型在绑定和数据访问策略中发挥的作用,演示如何显示和处理表单,涵盖添加到April 2011 Tools Update中的新特性,如基架和HTML5项目模板,展示在客户端和服务器端验证模型的过程给出利用成员资格、援权和安全特性的忠告,讲解将TDD应用于ASP.NET MVC的方法。

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧