一个自己给自己挖的MVC的坑
事情是这样的,我前几天突然想起没用过MVC提交之后刷新当前页面的方式更新View(一般情况是不会有人这么做的吧),我这人手快,就试了下,结果出现了个我想不明白的结果,Action代码如下:
[HttpPost]
public ActionResult STest(TestType type)
{
TestType display = new TestType() { AAA = type.AAA + "sa", SSS = "sss" }; ViewData.Model = display;
return View(display);
}
View代码:
@model Models.TestType
@{
ViewBag.Title = "STest";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>STest</h2>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>TestType</legend>
<div class="editor-label">
@Html.LabelFor(model => model.AAA)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AAA)
@Html.ValidationMessageFor(model => model.AAA)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.SSS)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.SSS)
@Html.ValidationMessageFor(model => model.SSS)
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
结果是,执行了action之后,页面没有变化,我加上去的"sa",木有加上去。。。
我清缓存,调代码,还把源码下了(可能调试的不细),实在想不明白了,就上msdn上问,也没问出结果,正好明天不上班,晚上查查资料,聊天的时候,顺便问了一下,结果@netfocus一语惊醒梦中人:“因为页面显示不是走post的呀”。我突然反应过来,rest的定义中,post就不负责传数据给页面,浪费了好多时间啊,看来还是对rest的理解不够。
特此纪念,同时也作为一个提醒,理论概念能很好的指导我们少走弯路。
=============咱是分割线=============
今天,群里另外一个朋友从技术角度给出了解决办法,十分感谢Ivan,如果有朋友不得不这么做,可以参考下
ModelState.Clear();
原因如下:
This is correct. This behavior is identical to the MVC 1.0 behavior.
The reason we use the posted value for editors rather than the model value is that the model may not be able to contain the value that the user typed. Imagine in your "int" editor the user had typed "dog". You want to display an error message which says "dog is not valid", and leave "dog" in the editor field. However, your model is an int: there's no way it can store "dog". So we keep the old value.
If you don't want the old values in the editor, clear out the Model State. That's where the old value is stored and pulled from the HTML helpers.
大概意思是说,就是这么设计的,原因是你如果改的时候,传了一个不匹配的值,结果是连验证信息都可能显示不出来
原帖地址:http://forums.asp.net/p/1527149/3687407.aspx
再次最后,这种做法确实不好,跨过了页面验证,直接Post值,拦截了传输一般的数据,强行hack的行为,V和C在同一个过程中都对M产生了影响,难以保证副作用,而且过程不再单纯,给人一种触发器的感觉,相信大家很少在项目中使用触发器,或许这也是之后出现了MVP和MVVM的原因之一。
一个自己给自己挖的MVC的坑的更多相关文章
- 自己写的一个Pager分页组件,WebForm,Mvc都适用
我一说写这个功能的时候,好多人估计有疑问.分页功能网上多的是,搜一个不就行了,你这样不是浪费时间么.你说这句话的时候,我是比较信的,首先自己写一些东西是很耗时,有这些时间又能多打几盘LOL了.但是我觉 ...
- 下一个系列学习列表Spring.net+NHibernate+MVC
开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 刘冬.NET 2011-08-19 ...
- 一个简单的Redis结合Spring MVC架构以及实现过程
为了加快开发人员对公司项目的理解.更加容易入手和对公司项目的整体把控. 整体框架 首先介绍公司项目的整体框架,闲话少说,直接上图 整体性能分析 这就是公司的一个整体的架构,为了开发人员对架构的侧重点的 ...
- 使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC + Mybatis的Web项目 (零配置文件)
前言: 除了mybatis 不是零配置,有些还是有xml的配置文件在里面的. 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration ...
- 001. 使用IDEA新建一个JAVA最简单的Spring MVC JAVAWEB程序
1. 我们打开一个空的IDEA 2. 选择Java之后点击Next 3. 点击Next创建空白工程 4. 给工程取个名字,叫MYIDEA 5. 勾选之后,点击This Window按钮 6. 我们可以 ...
- 【Struts2】新建一个Struts2工程,初步体验MVC
实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...
- 手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...
https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 距离上一次给小伙伴们汇报简易 ...
- devexpress entity framework 与 asp.net mvc的坑
最近在做一个使用ASP.NET MVC DEVEXPRESS和EF的OA模块 遇到不少问题这里记录一下: 1 如果项目中存在多个上下文类(DBContext的派生类),在做数据迁移的时候需要在不同目录 ...
- 一个 xxx is not defined 引发的爬坑之路
出处 https://www.cnblogs.com/daysme/ - 2018-01-06 昨晚找了一个代码解决了我对配置的需求.高兴的拿到手机上测试却发现点击没有效果,电脑上是可以的呀,电脑上的 ...
随机推荐
- Zend_Db_Table::getDefaultAdapter is not working
在Bootstrap中使用 $url = constant ( "APPLICATION_PATH" ) . DIRECTORY_SEPARATOR . 'configs' . D ...
- java多线程学习(一)
一.操作系统线程和进程的概念 线程是指进程中的一个运行单元,这个过程中也可调度实体. 线程与进程的差别: (1)地址空间:线程为进程内的一个运行单元.进程至少有一个线程(进程的主线程):进程的全部线程 ...
- C/C++各种类型int、long、double、char表示范围(最大和最小)
#include<iostream> #include<string> #include <limits> using namespace std; int mai ...
- easyui datagrid 单元格编辑 自动聚焦 、全选
$.extend($.fn.datagrid.methods, { editCell: function (jq, param) { return jq.each(function () { var ...
- Linux下给mysql创建用户分配权限
1.新建用户 //登录MYSQL @>mysql -u root -p @>密码 //创建用户 mysql> insert into mysql.user(Host,User,Pas ...
- C语言库函数大全及应用实例十三
原文:C语言库函数大全及应用实例十三 [编程资料]C语言库函数大全及应用实例十三 函数名: stat 功 能: 读取打 ...
- Android-Universal-Image-Loader学习笔记(两)--LruDiscCache
最近最少使用缓存官员最近(LruDiscCache)之前,引入一个概念,一个重要的三个班: key:这是DiscCacheAware接口save里面的方法imageUri通过调用参数FileNameG ...
- Pointers to classes (From the note of my firend)
Pointers to classes Objects can also be pointed to by pointers: Once declared, a class becomes a ...
- 安卓CTS官方文档之兼容性方案概览
兼容性方案概览 安卓的兼容性方案让安卓手机生产商能够很容易就开发中可兼容的安卓设备(天地会珠海分舵注:可兼容什么呢?就是可以兼容标准google提供的安卓系统可以支持的功能,以防手机生产商把开源的安卓 ...
- EXCEL导入GridView,然后再汇入数据库.
原文:EXCEL导入GridView,然后再汇入数据库. 近日项目中有一个多笔料号要输入,我做了一个用javascript复制输入框的功能,可以输入多笔料号. 但是使用者反馈,料号太多,可能几百个料号 ...