----------模型------------
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 。。。这是为什么 百思不得其姐
你可以F12看下提交时的FormData。你提交的时候,文本框的值仍旧是1,虽然你改变了模型中的值,但这个值并没有被form标签接受,form标签返回的仍是你之前传给它的值,也就是那个1。因此在View第二次渲染的时候,文本框读取的是你form data里的数据,而不是你更改之后模型的数据。
同样道理,如果你之前改变了文本框的值(比如改为111),你会发现刷新之后文本框里的值变成了111而不是123,这还是因为form传递过去的是你文本框里的值,和你修改之后模型里的值无关。
不知道我说的清楚不,从form的表现来看的确是这样的
好的,十分感谢。你的意思我明白的
然后我刚才又做了几个实验
View_A(使用Model_A) -> 提交 -> Action_B(HttpPost)渲染View_B(使用Model_B) 【Model_A与Model_B是不同的类型,其中存在同名属性】
结果View_B渲染出来的视图中数据的结果是这样的
同名属性 取值:前一个View提交的值【即使Model_B为同名属性赋值】
不同名属性 取值:当前视图模型的值【我觉得这个可以与 Model_A中非表单属性划等号】
这应该与你所所答的思路是一致的
不过,这个不同视图模型类型,只要属性相同就 使用前一页面所提交的属性值,确实。更让人意外。。。。
以上内容分享下,遇到过的话,就随意看看,没遇到的话,就当分享了
十分感谢
你的id是被渲染了,但是每次刷新的时候,你的id难道不是重新被赋值为1了么,也就是说你这里的定值给定死了,虽然代码运行过程中id是给赋值为123,但是当你调用的时候,model里面的值并没有改变,所以取值还是1
你的答案我不认同
首先我问题中描述了,操作流程的,
显示页面 -> 点击页面的提交按钮 -> 然后再此显示页面
注意:第一次显示页面是 没有[HttpPost]注释 的Index动作方法构建的视图模型
而第二次显示页面是 带有[HttpPost]注释 的Index动作方法构建的视图模型
-----------
而你说的【你的id难道不是重新被赋值为1了么】这点我不认同,如果是webForm的话,每次处理事件之前都会执行Page_load事件,但是这里是MVC啊,MVC才没有那种页面生命周期呢
没什么好疑惑的。你没有设置BeginForm的参数,那么默认是Get请求,你只需要在HttpPost的Action中打个断点就知道了。你问题中的第三步只是你想的,实际上走的是Get请求。
这个。。。。。。
我debug的过了。代码跟上面一样。BeginForm 都没有设置参数
我这里是 进入 HttpPost的Action中的。。。。。。。。。。
@算了: 先睡了,这不科学。上午再试试
@幻天芒: 嗯 早点歇着吧,
@算了: 抱歉,上面的解释错了。通过调试,确实是走的Post这条路,同时修改的值对非表单元素是生效的。但是只要是表单元素,那么还是会认FormData中的值。针对请求看了Response,发现生成的html元素中并没有用后台的Model值。对此,可能原因正如楼下 @飞鸟_Asuka 所说。
@幻天芒: 嗯 确实是,后来我有做了两个实验,
一:创建一个新的视图模型对象
二:干脆就不传递视图模型
结果都与所总结的一样,只要是表单数据,其实就是 之前表单提交的值
@幻天芒:
View_A(使用Model_A) -> 提交 -> Action_B(HttpPost)渲染View_B(使用Model_B) 【Model_A与Model_B是不同的类型,其中存在同名属性】
结果View_B渲染出来的视图中数据的结果是这样的
同名属性 取值:前一个View提交的值【即使Model_B为同名属性赋值】
不同名属性 取值:当前视图模型的值【我觉得这个可以与 Model_A中非表单属性划等号】
这应该与你所所答的思路是一致的
不过,这个不同视图模型类型,只要属性相同就 使用前一页面所提交的属性值,确实。更让人意外。。。。
@算了: 这个应该是Form特有的~
@幻天芒: 。。不是很明白
详细说两句呗
@算了: 我也不是很明白,只是从效果看,mvc的表单才有这个机制。
@算了: 可能需要去看看mvc的源码。
@幻天芒:
我晕,那还是算了,工作量无法估计了。
有闲暇时间再研究吧(估计这样的时间不会再有了)
抿一口红酒,心中默默的思索着这个问题。带着一点点暗淡的忧伤,仰望着天空空,看着那浩瀚的星号。由衷的说一声,大侠辛苦了,十分感谢
@算了: 土豪抿的是红酒,我却只能喝白开水,有一种深深的落寞~看着满屏的代码,只希望能码到功成...
一直没注意过这个问题,值得测试,关注一下~