MVC 表单的服务器端验证。

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

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

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

高手们是怎么做服务器端 验证的。
...全文
326 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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的长度什么的~ 不过我还是比较推荐定义一个实体类

62,243

社区成员

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

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

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

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