首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果开机自检后Model中的值发生更改,表单仍显示旧值

如果开机自检后Model中的值发生更改,表单仍显示旧值
EN

Stack Overflow用户
提问于 2009-12-04 17:53:53
回答 4查看 5K关注 0票数 8

这种行为让我开始怀疑自己的理智..

我有一个表单,它有两个地方接受输入,我们称它们为ValueA和ValueB。用户可以在其中任何一个字段中输入值,然后表单将提交。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="MyUpdateTarget">
 <% using (Ajax.BeginForm("MyControllerAction", new AjaxOptions { UpdateTargetId = "MyUpdateTarget" })) { %>
  <%=Html.TextBox("ValueA", Model.ValueA, new Dictionary<string, object> {
                                                    { "onchange", "$('#SubmitButton').click(); return false;" },
       }) %>
  <%=Html.TextBox("ValueB", Model.ValueB, new Dictionary<string, object> {
                                                    { "onchange", "$('#SubmitButton').click(); return false;" },
       }) %>
  <input id="SubmitButton" type="submit" value="Save" style="display: none;" />
 <% } %>
</div>

控制器操作如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ActionResult MyControllerAction(MyViewModel viewModel)
{

//做一些其他的事情...

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 return PartialView("MyPartialView", viewModel);
}

ViewModel就是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyViewModel
{
 private int _valueA;
 private int _valueB;

 public int ValueA 
 { 
  get
  {
   return _valueA;
  }
  set
  {
   if (value > 0)
   {
    ValueB = 0;
   }
   _valueA = value;
  } 
 }
 public int ValueB 
 {
  get
  {
   return _valueB;
  }
  set
  {
   if (value > 0)
   {
    ValueA = 0;
   }
   _valueB = value;
  }
 }
}

现在,出乎意料的部分。假设页面最初加载,ValueB的值为7。用户将ValueA更改为5,然后表单提交。我可以在控制器操作中设置断点,并在viewModel参数中查看这两个值。此时,ValueA为5,ValueB为0(由于ValueA的设置)。该操作将viewModel作为PartialView的一部分返回。回到片断部分,我可以在Html.TextBox("ValueB",Model.ValueB,...)上设置一个断点。行中,可以看到ValueB确实为0。但是当表单呈现给浏览器时,ValueB的值仍然是7,这就是我遇到的问题。我甚至将Update目标更改为一个不同的div,以便partial只是在完全不同的地方显示出表单,但它仍然具有原始值7,即使我通过调试看到从控制器返回的值是0。

我是不是漏掉了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-04 19:58:25

下面是文本框的MVC源代码中的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     string attemptedValue = (string)htmlHelper.GetModelStateValue(name, typeof(string));
                tagBuilder.MergeAttribute("value", attemptedValue ?? ((useViewData) ? htmlHelper.EvalString(name) : valueParameter**), isExplicitValue);
                break;

和GetModelStateValue()的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    internal object GetModelStateValue(string key, Type destinationType) {
        ModelState modelState;
        if (ViewData.ModelState.TryGetValue(key, out modelState)) {
            if (modelState.Value != null) {
                return modelState.Value.ConvertTo(destinationType, null /* culture */);
            }
        }
        return null;
    }

所以发生了什么是Helper查找文本框的值,通过匹配名称,在你的ViewData.ModalState中,如果它在ModelState字典中,它完全忽略你提供的值。

所以所有的if (value > 0) { ValueA = 0;}都无关紧要,因为如果名称匹配,它将使用ModelState中的POST值。

我解决这个问题的方法是,在视图呈现某些我想在视图模型中弄乱的值之前,清除ModelState。这是我用过的一些代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void SanitizeWildcards( Controller controller, params string[] filterStrings )
    {
        foreach( var filterString in filterStrings )
        {
            var modelState = controller.ModelState;

            ModelState modelStateValue;
            if( modelState.TryGetValue(filterString,out 
                    controller.ModelState.SetModelValue(filterString, new ValueProviderResult("","", null));
        }
    }
票数 8
EN

Stack Overflow用户

发布于 2010-11-09 13:01:10

清除整个ModelState也可以做到这一点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ViewData.ModelState.Clear();
票数 8
EN

Stack Overflow用户

发布于 2010-07-18 14:50:54

谢谢jaf..这是vb代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Sub CleanForm(ByVal ParamArray Fields() As String)
    Dim modelStateValue As ModelState = Nothing
    For Each Field In Fields
        If ModelState.TryGetValue(Field, modelStateValue) Then
            ModelState.SetModelValue(Field, New ValueProviderResult(Nothing, Nothing, Nothing))
        End If
    Next
End Sub
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1848586

复制
相关文章
并发编程时遇到的问题
观察逻辑发现这个数组中的每个元素执行起来,其实没有必然的先后关系,完全可以并发执行,于是我改了一版代码:
有财君
2023/03/22
5130
并发编程时遇到的问题
处理solr时遇到的问题
前面的博客说了,我在解决solr索引的问题,但是后面我遇到的问题一次比一次严重,上次还能访问solr和系统,上次博客中看到我的solr上面有报错,那是我new_core出现的问题,我作死的在linux中删除了new_core文件
余生大大
2022/11/02
6260
处理solr时遇到的问题
继承HibernateDaoSupport时遇到的问题
都知道spring提供的有零配置功能,而且看见别人的一个项目使用spring+mybatis,只在applicationContext.xml里定义了sqlSessionFactory,然后什么都不用配置了,baseDao继承自SqlSessionDaoSupport,只需要在每个dao上加@Repository注解,spring会自动向对象中注入sqlSessionFactory对象。
用户1212940
2019/05/28
9910
EasyGBS查找大华设备的录像列表时失败
EasyGBS查找大华设备的录像列表时页面提示query recordinfo return 400 Bad Request
EasyNVR
2020/04/23
7860
EasyGBS查找大华设备的录像列表时失败
Python在import时遇到的惨案
    最近使用基于python语言的django框架开发web相关的应用,但是在访问页面的时候会不定时的报错,import导入报错
用户9127725
2022/08/08
4370
MeterSphere教程:列表数据断言遇到的问题
另外的话,如果测试环境经常会删数据之类的,那么接口里面的测试数据可能就会受到影响,要尽可能的保证用例的稳定正常的执行。
小博测试成长之路
2023/02/24
1K0
MeterSphere教程:列表数据断言遇到的问题
我在移动web开发中遇到的各种问题
目前(2015年8月3日15:02:24)在大部分安卓手机都发现这个问题,触发bug的条件知道了,但是原因未知。触发bug的条件是需要横向滚动的层不能位于纵向滚动不是body的层下面(后面有具体解释)。
黒之染
2018/10/19
1.8K0
LAMP安装mysql 时遇到的问题汇总
1: 缺少 libaio 包, libaio是Linux下的一个异步非阻塞方式读写文件的接口。 1 2 3 [[email protected] MySQL]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql Installing MySQL system tables... ./bin/mysqld: error while loading shared libraries: libaio.so.1:
老七Linux
2018/05/09
1.5K0
AIR切换SDK版本时遇到的问题
切换SDK,有时候会遇到这个问题。上面我使用的是sdk4.5,只需要修改应用程序的app.xml配置就可以正常运行air程序了。
meteoric
2018/11/16
7340
Impala删除kudu表时遇到的问题
在IMPALA上面创建了KUDU表之后DROP TABLE了该表,想要重新执行建表语句,但是发现报错了,提示表已存在无法新建。
chimchim
2023/10/17
4890
Impala删除kudu表时遇到的问题
记录使用mongoDB时遇到的有趣问题
最近在开发金融类的k线、盘口业务,而这些业务的海量数据如何存储,公司的技术选型,选择了MongoDB。
Blue_007
2023/10/21
2230
记录使用mongoDB时遇到的有趣问题
Struts框架搭建时所遇到的问题
        解决方案:将以下7个jar拷贝到项目工程中_(workspace_项目名_webRoot_WEB-INF_lib下),其他用到的包再慢慢添加:                             struts2-core-2.1.6.jar、                             xwork-2.1.2.jar、                             freemarker-2.3.13.jar、                            ognl-2.6.11.jar、                            commons-logging-1.0.4.jar、                            commons-fileupload-1.2.1.jar、                            commons-io-1.3.2.jar
shirayner
2018/08/10
4380
python 中如何查找列表长度
In this article, we will be unveiling techniques to find the length of a Python list. Finding the length actually means fetching the count of data elements in an iterable.
用户8418197
2022/01/09
2.7K0
在MATLAB中优化大型数据集时通常会遇到的问题以及解决方案
以上是在MATLAB中优化大型数据集时可能遇到的问题,对于每个问题,需要根据具体情况选择合适的解决方案。
一凡sir
2023/08/09
6490
在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。 至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。 1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexChanged,在于这个
用户1653704
2018/06/07
1.6K0
我在面试机器学习、大数据岗位时遇到的各种问题
自己的专业方向是机器学习、数据挖掘,就业意向是互联网行业与本专业相关的工作岗位。各个企业对这类岗位的命名可能有所不同,比如数据挖掘/自然语言处理/机器学习算法工程师,或简称算法工程师,还有的称为搜索/推荐算法工程师,甚至有的并入后台工程师的范畴,视岗位具体要求而定。 机器学习、大数据相关岗位的职责 自己参与面试的提供算法岗位的公司有 BAT、小米、360、飞维美地、宜信、猿题库 等,根据业务的不同,岗位职责大概分为: 平台搭建类 数据计算平台搭建,基础算法实现,当然,要求支持大样本量、高维度数据,所以可能
小莹莹
2018/04/20
1.3K0
我在面试机器学习、大数据岗位时遇到的各种问题
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 右键选择该文件.cpp格式的->属性->预编译头,→ 不使用预编译头 错误描述:fatal err
战神伽罗
2019/07/24
8.4K0
使用jQuery中hover事件时遇到的一个小问题
在jQuery中有一个hover()方法,它可以实现模拟css中:hover这个伪类的效果。
colezhou
2019/11/24
1.8K0
如何解决爬虫程序中登录时遇到的动态Token问题
在进行网络爬虫开发时,我们经常会遇到登录网站的需求。然而,有些网站为了增加安全性,会采用动态Token的方式进行用户认证。这就给爬虫程序的开发带来了一定的的挑战。所以今天我们就重点来介绍如何解决爬虫程序中登录时遇到的动态问题。
小白学大数据
2023/08/16
1.3K0
点击加载更多

相似问题

在Prolog中查找列表长度时遇到的问题

21

在测试python中是否存在列表中的内容时遇到问题

10

在Puppet中查找模板时遇到问题

22

在python selenium中查找元素时遇到的问题

15

查找每个会话的列表消息查询时遇到问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文