开发笔记_C#.Net MVC _01

C#.NET开发遇到的问题记录

                    —— 前台字段的控制

初入职场,第一次正式使用MVC模式。在实现一个系统后台用户管理模块时遇到一点小问题。做个笔记记录,供以后参考完善。

首先,需求是一个类似于修改用户信息并提交表单到后台数据库的操作。但是,由于某些权限的要求,需要设置有部分栏位在当前登录的账户下是只允许查看,不允许修改的。
这里,很容易就可以想到 disable 属性、readonly 属性、Display写法与unselectable写法。

        如下: @Html.TextBoxFor(t => t.USERNO, new { @disabled = "disabled" })
            或:@Html.DisplayFor( t => t.USERNO)
            或: @Html.TextBoxFor(t => t.USERNO, new { @readonly= "readonly" })
            或@Html.TextBoxFor(t => t.USERNO, new { @unselectable= "on" })
而这三种写法单独的效果分别是:

                    disable 属性  -- 展示的效果符合要求(有边框,灰色,不可修改)。但是提交的却是 null 值
                    readonly属性 -- 可以提交,也确实不可修改。但是由于鼠标点上去会有光标闪烁,切颜色与普通text一样,用户体验效果不是很好
                    DisplayFor写法 -- 没有文本框的边框,仅仅展示数据,对于一个表格样式而言,显得十分突出。
                     unselectable写法  -- 不能选中。自然也不可修改,也可以提交。就上面需求而言最符合要求的写法。


最终,我个人使用的是 disable 的效果,当然,null 值对目前我所遇到的案例来说几乎没有影响,因为,不允许修改的四个栏位中有一个栏位是主键,必须提交,而其他三个栏位既然不允许修改,那也没有必要提交,SQL 的 PDATE 句中不更新这三个栏位即可,对于主键栏位,只需要添加一个隐藏域,如:@Html.TextBoxFor(t => t.USERNO, new { @readonly = "readonly", @hidden = "hidden"})  或  @Html.Hidden( t => t.USERNO)即可。意外的是,在这里有一个小插曲,IE6  7的浏览器貌似不支持第一种hidden属性的Razor语法,直接导致页面上显示两个输入框。

但是最终的问题是。如果有部分字段,仅仅是部分用户不可修改,其他用户依然可以修改的,那样的话 SQL 语句中是不可能不更新这种字段的。
可能会有人想到,将类似于这种需求的栏位全部同上主键栏位一般,采用disable + hidden的写法。

貌似这样理论上是可行的。但是,别忘了 F12 开发者选项这个逆天的神器。
F12之后,直接将 disable 属性或者 hidden属性删掉,然后修改数据,是依然可以正常提交的。
鉴于上面我目前所做的项目而言,因为唯一一个不允许修改且必须提交的栏位是主键,同时也是 UPDATE 语句的条件,所以即使这样操作了,也不会修改成功。

但是如果遇上其他的不允许修改且必须提交的非主键非UPDATE语句条件的栏位。恐怕不管是前台的disable还是readonly,都会存在一定的安全风险。所以,这种限制或者需要在后台去完成。

不知怎么写可以完美解决?

猜你喜欢

转载自blog.csdn.net/shaotaiban1097/article/details/80285535