首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >元数据与ViewData在HtmlHelper (DropDownListFor Bug?)

元数据与ViewData在HtmlHelper (DropDownListFor Bug?)
EN

Stack Overflow用户
提问于 2016-05-13 07:00:15
回答 1查看 307关注 0票数 0

我正在试验定制的ModelMetadataProvider。看起来像TextBoxFor这样的html助手很好地使用了这些工具。然而,在其他情况下,如DropDownListFor,他们更倾向于ViewData。例如,查看我看到的一些反射代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  bool flag = false;
  if (selectList == null)
  {
    selectList = SelectExtensions.GetSelectData(htmlHelper, name);
    flag = true;
  }
  object defaultValue = allowMultiple ? htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof (string[])) : htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof (string));
  if (defaultValue == null && !string.IsNullOrEmpty(name))
  {
    if (!flag)
      defaultValue = htmlHelper.ViewData.Eval(name);
    else if (metadata != null)
      defaultValue = metadata.Model;
  }

注意所有获得"defaultValue“的不同尝试。使用metadata.Model是最后一次。为什么要在这里分开?如果通过该代码跟踪,最终会在调用ViewData.Eval时结束,该调用作为回退只是使用反射将模型的值从模型中提取出来。是否存在自定义ViewData提供程序来弥补这一差距?

编辑:我开始倾向于认为这是框架中的一个bug。

考虑两段代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Html.DropDownListFor(model => model.ErrorData.Shift, Model.ShiftOptions, new { @class = "form-control" })

上面的代码传入选项"Model.ShiftOptions“。因此,它不会传递条件"selectList==null“,因此”标志“永远不会设置,而是继续尝试通过反射( Eval调用)从类型获取默认值。

但是,使用此代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@{ ViewData[Html.NameFor(m => m.ErrorData.Shift).ToString()] = Model.ShiftOptions;}
@Html.DropDownListFor(model => model.ErrorData.Shift,null, new { @class = "form-control" })

.“标志”现在被满足,默认值现在被检索到metadata.Model。为什么提供列表选项的不同机制会改变(甚至影响)从其中检索默认值的位置?

编辑#2

警告:如果在编辑器模板( ViewData )中调用复杂类型的DropDownListFor,上述DropDownListFor“修复”将无法工作。NameFor调用将返回属性的名称,包括从EditorFor调用的外部上下文,即MyViewModel.ErrorData.Shift。但是,顶部的原始代码片段中的DropDownListFor代码查找的是没有原始上下文的ViewData项,即ErrorData.Shift。他们都用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExpressionHelper.GetExpressionText((LambdaExpression) expression)

但是,NameOf对该结果使用html.Name。当DDLF最终开始生成它的名称时,它会做一些类似的事情,因此它的名称是正确的,但是在查找视图数据选项时,它不包括它的完整上下文是没有意义的。

EN

回答 1

Stack Overflow用户

发布于 2016-05-13 17:52:14

用于生成表单的所有HtmlHelper方法首先检查ModelState ( GetModelStateValue()方法)中是否存在属性的值,以处理表单被提交时使用无效值并返回视图的情况(请参阅这个答案的第2部分,以解释为什么这是默认行为)。

例如,在使用DropDownList()的情况下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Html.DropDownList("xxx", null, "--Please select--")

如果xxx是作为ViewBag属性添加的IEnumerable<SelectListItem>,则selectList的值为null,执行第一个if块中的代码,flag的值为true (还请注意,模型可能有或可能没有一个名为xxx的属性,这意味着< code >D15可能是null)。

或者,如果您使用强类型的DropDownListFor()方法,例如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Html.DropDownListFor(m => m.SomeProperty, Model.SomePropertyList, "--Please select--")

selectList的值不是null (假设SomePropertyListIEnumerable<SelectListItem>而不是null),flag的值是false

因此,各种检查只是考虑了使用DropDownList()DropDownListFor()生成<select>元素的不同方式,以及是否绑定到模型属性。

附带注意:实际代码(来自私有静态MvcHtmlString SelectInternal()方法)是bool usedViewData = false;,而不是bool flag = false;

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37213368

复制
相关文章
使用 iptables 将 Kubernetes Service 流量随机发送到 Pod
本文将带大家了解 Kubernetes 的 kube-proxy 组件如何使用 iptables 将 service 流量随机发送到 Pod,目的是实现 service 所需的 iptables 规则。
CNCF
2021/04/21
1.7K0
python web应用_如何使用Python将通知发送到Web应用
如何使用Python将通知发送到Web应用 (How to send notifications to your Web App using Python)
用户7886150
2021/01/01
2.5K0
使用Logstash接收Netflow日志并发送到syslog服务器
接受90端口的netflow日志,解析netflow中的源IP、端口、目的IP、端口,并输出syslog到任意端口
heasy3
2020/08/02
2K0
linux审计日志在哪里,linux – 将审计日志发送到SYSLOG服务器
这个答案可能仍然有效,但在2014年,using the Audisp plugin是更好的答案.
全栈程序员站长
2022/08/23
4.1K0
将CSV的数据发送到kafka(java版)
前面的图可以看出,读取CSV再发送消息到kafka的操作是Java应用所为,因此今天的主要工作就是开发这个Java应用,并验证;
程序员欣宸
2021/04/16
3.5K0
将CSV的数据发送到kafka(java版)
使用alpha混合将图像分层和图像抗锯齿。
import matplotlib.pyplot as plt import numpy as np methods = [None, 'none', 'nearest', 'bilinear', 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', 'bessel', 'mitchell',
裴来凡
2022/05/28
1.2K0
使用alpha混合将图像分层和图像抗锯齿。
如何将Flink应用的日志发送到kafka
产线环境上的Flink应用是长时运行的应用,日志量较大,通过flink web页面查看任务日志会导致浏览器卡死,通过日志排查问题非常不便。因此,需要将flink应用的日志发送到外部系统,方便进行日志检索
Eights
2020/09/10
2.4K0
如何将Flink应用的日志发送到kafka
系统捕获异常并发送到服务器
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了
xiangzhihong
2018/01/30
9400
系统捕获异常并发送到服务器
构建fluentd镜像将收集的日志发送到elasticsearch
构建脚本: version: "3" services: fluentd: build: ./fluentd volumes: - ./fluentd/conf:/fluentd/etc privileged: true ports: - "24224:24224" - "24224:24224/udp" environment: - TZ=Asia/Shanghai restart: always
johnhuster的分享
2022/03/28
5340
Office.Core服务器无法使用问题
1).通过webconfig中增加模拟,加入管理员权限, <identity impersonate="true" userName="系统管理员" password="系统管理员密码"/> 2).这样就能够启动Application进程,操作EXCEL了,能够新建EXCEL,导出EXCEL,但是还是不能打开服务器端的EXCEL文件
happlyfox
2018/10/31
9270
Ubuntu下无法使用SecureCRT连接服务器
把配置文件中的"PermitRootLogin without-password"加一个"#"号注释掉,再增加一句"PermitRootLogin yes",保存文件,如下图。这样做是为了允许root用户登录
知忆
2021/06/09
4.3K0
H3C交换机配置信息中心将日志发送到日志服务器
摘自官方文档 http://www.h3c.com/cn/d_200711/317187_30005_0.htm#_Toc164570689
yuanfan2012
2020/06/10
10.4K0
H3C交换机配置信息中心将日志发送到日志服务器
[记]使用jQuery Jcrop 图像裁剪无法更换图片的坑
​ 因为公司需求,需要完成一个显示屏定制的业务,用户自主上传图片然后在线裁剪的功能,我选择了jQuery Jcrop这个插件。 先看看怎么使用 使用方法 载入 CSS 文件 <link rel="stylesheet" href="jquery.Jcrop.css"> 载入 JavaScript 文件 <script src="jquery.js"></script> <script src="jquery.Jcrop.js"></script> 给 IMG 标签加上 ID <img id="e
游魂
2018/06/08
1.6K0
Python中日志异步发送到远程服务器
背景 在Python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应 的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直
CeshirenTester
2022/06/09
3820
使用K-Means算法将图像压缩6倍!
在本文中,我们将讨论K-Means算法,它是一种基于聚类的无监督机器学习算法。此外,我们还将讨论如何使用K-Means来压缩图像。
Python数据科学
2019/04/09
1.4K0
使用K-Means算法将图像压缩6倍!
如何将SVG图像使用在HTML网站中
使用PS生成SVG图像用编辑器打开发现是data:img/png;base64而非/path
Din
2018/10/19
4.7K0
如何将SVG图像使用在HTML网站中
Apache报错:无法使用可靠的服务器域名
网上很多说改为 ServerName localhost:80, 其实去掉前面注释报错就不显示了
很酷的站长
2023/02/18
1.1K0
Apache报错:无法使用可靠的服务器域名
使用 Proxifier 将本机代理为服务器
  咱们并不能直接使用 Proxifier 进行代理,需要为其先创建一个隧道。就好比咋给两个世界搞一个虫洞,让小飞机可以穿过虫洞到达另外一个世界。常见的 SSH 工具都有构建隧道的功能,我这里以 FinalShell 为例。毫无疑问,第一步先连接上服务器。第二步点击右下角设置 ☞ 然后选择隧道 ☞ 添加隧道。其中隧道名称可以任意填写,类型选择 SOCKS5,监听端口任意,该端口为隧道服务的端口,IP 为隧道的 ip,一般为 127.0.0.1。
Demo_Null
2020/09/28
4.8K0
使用 Proxifier 将本机代理为服务器
使用OpenTelemetry Operator将可观测数据发送到SigNoz
OpenTelemetry Operator 是一个用于部署和管理 OpenTelemetry 组件的 Kubernetes Operator。它是一个自定义的 Kubernetes 控制器,使用 Operator 模式自动化了 OpenTelemetry 环境的部署、配置和管理过程。
我是阳明
2023/09/11
1.1K0
使用OpenTelemetry Operator将可观测数据发送到SigNoz
点击加载更多

相似问题

无法将图像发送到服务器

21

如何使用angular-file-upload获取图像尺寸

20

无法将图像发送到Go服务器

16

无法将图像发送到我的服务器

20

使用NSURLSession将图像发送到服务器

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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