首页 新闻 会员 周边

MVC的问题。。。很疑惑

0
悬赏园豆:15 [已解决问题] 解决于 2014-11-26 22:11

----------模型------------

public class TestModel {
  public int id { get; set; }
  public string name { get; set; }
  public string other { get; set; }
}

-------------动作方法-------------------

public ActionResult Index()
{
  TestModel tm = new TestModel
  {
    id=1,
    name="n1",
    other="o1"
  };

  return View(tm);
}

[HttpPost]
public ActionResult Index(TestModel tm) {

  tm.id = 123;      注意这里!!!!!!!

  return View(tm);
}

-----------视图--------------

@using (Html.BeginForm())
{
  @Html.TextBoxFor(x => x.id)
  <br />
  @Html.TextBoxFor(x => x.name)
  <input type="submit" value="提交" />
}

@Html.TextBoxFor(x=>x.other)

 

=====================================

以上几乎是全部代码了。

先描述下

这是在编程过程中遇到的一个问题,然后就制作了上面的例子,来实验下

 

1:通过Index方法显示页面

2:点击页面提交按钮

3:通过httppost的动作方法index重新显示页面

在第三步中的动作方法(上面代码中标注出的代码)修改了视图模型的一个属性

并将修改后的视图模型 传递给 视图

但是视图渲染后的结果

通过id渲染的 文本框的值 依然是 1 而不是  123  。。。这是为什么 百思不得其

 

 

算了的主页 算了 | 初学一级 | 园豆:3
提问于:2014-11-25 22:01
< >
分享
最佳答案
0

你可以F12看下提交时的FormData。你提交的时候,文本框的值仍旧是1,虽然你改变了模型中的值,但这个值并没有被form标签接受,form标签返回的仍是你之前传给它的值,也就是那个1。因此在View第二次渲染的时候,文本框读取的是你form data里的数据,而不是你更改之后模型的数据。

同样道理,如果你之前改变了文本框的值(比如改为111),你会发现刷新之后文本框里的值变成了111而不是123,这还是因为form传递过去的是你文本框里的值,和你修改之后模型里的值无关。

不知道我说的清楚不,从form的表现来看的确是这样的

收获园豆:7
飞鸟_Asuka | 菜鸟二级 |园豆:209 | 2014-11-26 01:10

好的,十分感谢。你的意思我明白的

然后我刚才又做了几个实验

View_A(使用Model_A) -> 提交 -> Action_B(HttpPost)渲染View_B(使用Model_B)  【Model_A与Model_B是不同的类型,其中存在同名属性】

结果View_B渲染出来的视图中数据的结果是这样的

同名属性   取值:前一个View提交的值【即使Model_B为同名属性赋值】

不同名属性    取值:当前视图模型的值【我觉得这个可以与 Model_A中非表单属性划等号】

 

这应该与你所所答的思路是一致的

不过,这个不同视图模型类型,只要属性相同就 使用前一页面所提交的属性值,确实。更让人意外。。。。

以上内容分享下,遇到过的话,就随意看看,没遇到的话,就当分享了

十分感谢

算了 | 园豆:3 (初学一级) | 2014-11-26 21:31
其他回答(3)
0

你的id是被渲染了,但是每次刷新的时候,你的id难道不是重新被赋值为1了么,也就是说你这里的定值给定死了,虽然代码运行过程中id是给赋值为123,但是当你调用的时候,model里面的值并没有改变,所以取值还是1

_Vegetables | 园豆:586 (小虾三级) | 2014-11-25 22:25

你的答案我不认同

首先我问题中描述了,操作流程的,

显示页面 -> 点击页面的提交按钮 -> 然后再此显示页面

注意:第一次显示页面是 没有[HttpPost]注释 的Index动作方法构建的视图模型

而第二次显示页面是 带有[HttpPost]注释      的Index动作方法构建的视图模型

-----------

而你说的【你的id难道不是重新被赋值为1了么】这点我不认同,如果是webForm的话,每次处理事件之前都会执行Page_load事件,但是这里是MVC啊,MVC才没有那种页面生命周期呢

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-25 22:50
0

没什么好疑惑的。你没有设置BeginForm的参数,那么默认是Get请求,你只需要在HttpPost的Action中打个断点就知道了。你问题中的第三步只是你想的,实际上走的是Get请求。

收获园豆:8
幻天芒 | 园豆:37175 (高人七级) | 2014-11-26 00:10

这个。。。。。。

我debug的过了。代码跟上面一样。BeginForm 都没有设置参数

我这里是 进入 HttpPost的Action中的。。。。。。。。。。

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-26 00:31

@算了: 先睡了,这不科学。上午再试试

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-11-26 00:34

@幻天芒: 嗯 早点歇着吧,

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-26 00:50

@算了: 抱歉,上面的解释错了。通过调试,确实是走的Post这条路,同时修改的值对非表单元素是生效的。但是只要是表单元素,那么还是会认FormData中的值。针对请求看了Response,发现生成的html元素中并没有用后台的Model值。对此,可能原因正如楼下 @飞鸟_Asuka 所说。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-11-26 10:00

@幻天芒: 嗯 确实是,后来我有做了两个实验,

一:创建一个新的视图模型对象

二:干脆就不传递视图模型

结果都与所总结的一样,只要是表单数据,其实就是 之前表单提交的值

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-26 20:37

@幻天芒: 

View_A(使用Model_A) -> 提交 -> Action_B(HttpPost)渲染View_B(使用Model_B)  【Model_A与Model_B是不同的类型,其中存在同名属性】

结果View_B渲染出来的视图中数据的结果是这样的

同名属性   取值:前一个View提交的值【即使Model_B为同名属性赋值】

不同名属性    取值:当前视图模型的值【我觉得这个可以与 Model_A中非表单属性划等号】

 

这应该与你所所答的思路是一致的

不过,这个不同视图模型类型,只要属性相同就 使用前一页面所提交的属性值,确实。更让人意外。。。。

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-26 21:31

@算了: 这个应该是Form特有的~

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-11-26 22:32

@幻天芒: 。。不是很明白

详细说两句呗

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-27 00:30

@算了: 我也不是很明白,只是从效果看,mvc的表单才有这个机制。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-11-27 08:38

@算了: 可能需要去看看mvc的源码。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-11-27 08:39

@幻天芒: 

我晕,那还是算了,工作量无法估计了。

有闲暇时间再研究吧(估计这样的时间不会再有了)

抿一口红酒,心中默默的思索着这个问题。带着一点点暗淡的忧伤,仰望着天空空,看着那浩瀚的星号。由衷的说一声,大侠辛苦了,十分感谢

支持(0) 反对(0) 算了 | 园豆:3 (初学一级) | 2014-11-27 10:11

@算了: 土豪抿的是红酒,我却只能喝白开水,有一种深深的落寞~看着满屏的代码,只希望能码到功成...

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-11-27 10:31
0

一直没注意过这个问题,值得测试,关注一下~

晓菜鸟 | 园豆:2594 (老鸟四级) | 2014-11-26 10:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册