事情是这样的,我前几天突然想起没用过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的坑的更多相关文章

  1. 自己写的一个Pager分页组件,WebForm,Mvc都适用

    我一说写这个功能的时候,好多人估计有疑问.分页功能网上多的是,搜一个不就行了,你这样不是浪费时间么.你说这句话的时候,我是比较信的,首先自己写一些东西是很耗时,有这些时间又能多打几盘LOL了.但是我觉 ...

  2. 下一个系列学习列表Spring.net+NHibernate+MVC

    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 刘冬.NET 2011-08-19 ...

  3. 一个简单的Redis结合Spring MVC架构以及实现过程

    为了加快开发人员对公司项目的理解.更加容易入手和对公司项目的整体把控. 整体框架 首先介绍公司项目的整体框架,闲话少说,直接上图 整体性能分析 这就是公司的一个整体的架构,为了开发人员对架构的侧重点的 ...

  4. 使用IDEA搭建一个Spring + AOP (权限管理 ) + Spring MVC + Mybatis的Web项目 (零配置文件)

    前言: 除了mybatis 不是零配置,有些还是有xml的配置文件在里面的. 注解是Spring的一个构建的一个重要手段,减少写配置文件,下面解释一下一些要用到的注解: @Configuration  ...

  5. 001. 使用IDEA新建一个JAVA最简单的Spring MVC JAVAWEB程序

    1. 我们打开一个空的IDEA 2. 选择Java之后点击Next 3. 点击Next创建空白工程 4. 给工程取个名字,叫MYIDEA 5. 勾选之后,点击This Window按钮 6. 我们可以 ...

  6. 【Struts2】新建一个Struts2工程,初步体验MVC

    实现目标 地址栏输入http://localhost:88/Struts2HelloWorld/helloworld.jsp 输入用户名,交由http://localhost:88/Struts2He ...

  7. 手撸了一个HTTP框架:支持Sprng MVC、IOC、AOP,拦截器,配置文件读取...

    https://github.com/Snailclimb/jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 距离上一次给小伙伴们汇报简易 ...

  8. devexpress entity framework 与 asp.net mvc的坑

    最近在做一个使用ASP.NET MVC DEVEXPRESS和EF的OA模块 遇到不少问题这里记录一下: 1 如果项目中存在多个上下文类(DBContext的派生类),在做数据迁移的时候需要在不同目录 ...

  9. 一个 xxx is not defined 引发的爬坑之路

    出处 https://www.cnblogs.com/daysme/ - 2018-01-06 昨晚找了一个代码解决了我对配置的需求.高兴的拿到手机上测试却发现点击没有效果,电脑上是可以的呀,电脑上的 ...

随机推荐

  1. MBProgressHUD 问题

    1.MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithWindow:[UIApplication sharedApplication].keyWi ...

  2. 【Hibernate步步为营】--复合主键映射具体解释

    上篇文章讨论了继承映射,它是对象模型中最主要的特性,对于继承映射它的主要区分是字段类型的不同,所以在生成表结构时须要有新列来标识数据的类型,能够使用<subclass>标签并在标签中加入d ...

  3. C++使用简单的函数指针

    函数指针: 被调用函数指针必须包括函数的存储器地址,为了正常工作,指针还必须包括其它信息,这一参数列表指针的参数类型和返回类型的函数. 因此,当你声明一个函数指针,数的參数类型和返回类型.以及指针名. ...

  4. cocos2d-x 网络请求

    [cocos2dx]rapidjson用法以及中文显示的解决方法 cocos2dx 读取json及解析 cocos2dx rapidjson 高速解析JSON  --- [cocos2d-x官方文档] ...

  5. unity 编辑器和插件生产(四.2)

    上次 我们告诉编辑器制作,如何将图像加载到现场,如今 我们要告诉下.怎么样 制造UIButton以及UIimage交换. 阿土. 进入专题. 首先,我们要明白 unity机制.button属性等. 首 ...

  6. 线程问题、异常处理、自定义URL

    线程问题.异常处理.自定义URL   本节又带了一些常用的,却很难理解的问题,本节从文件上传功能的实现引出了线程使用,介绍了线程饥饿的解决方法,异常处理方法,了解RouteTable自定义路径 . 系 ...

  7. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  8. HDU 3117 Fibonacci Numbers(围绕四个租赁斐波那契,通过计++乘坐高速动力矩阵)

    HDU 3117 Fibonacci Numbers(斐波那契前后四位,打表+取对+矩阵高速幂) ACM 题目地址:HDU 3117 Fibonacci Numbers 题意:  求第n个斐波那契数的 ...

  9. 查询出各个学科的前3名的同学信息的Sql

    查找各个学科的成绩前3名的学生信息Sql,有2种方法,一种是利用sql的row_number() over()函数,另一种是用子查询, 表设计如下 如果不考虑各个学科的成绩有并列的情况的话,有如下两种 ...

  10. java保存获取Web内容的文件

    package com.mkyong;   import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...