- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
对于任何有想法的人来说,这有点奇怪……我正在特定页面上渲染一个隐藏的 bool 字段。但是,根据特定事件是否在流程之前发生,我会为同一字段获得两个略有不同的标记。正在生成的两个字段是;
<input id="HasPreviouslyIssuedCard" name="HasPreviouslyIssuedCard" type="hidden" value="false" />
<input id="HasPreviouslyIssuedCard" name="HasPreviouslyIssuedCard" type="hidden" value="False" />
@Html.Hidden("HasPreviouslyIssuedCard", Model.HasPreviouslyIssuedCard?.ToString(), new { id = nameof(Model.HasPreviouslyIssuedCard) })
@Html.HiddenFor(m => m.HasPreviouslyIssuedCard)
HiddenFor()
中挖掘 MVC 的渲染逻辑方法,最终
Convert.ToString(value, CultureInfo.CurrentCulture)
叫做。当直接调用时,我无法让它产生一个小写的 bool 值,但它显然是这样做的。我当前的文化代码设置为
en-IE
但是在直接调用它时我看到的是大写的 bool 值。
/
通过 HTTP 检索 GET
. bool input
标签呈现为 True
/False
/Apply
的向导中的第一页通过 HTTP 检索 GET
. bool input
标签呈现为 True
/False
POST
检索. input
案例标签现在呈现为 true
/false
. input
标签现在以大写形式返回渲染(最初报告的问题)。 IConverter
的实现。写入 bool 值,而不是
Convert.ToString(value, CultureInfo.CurrentCulture)
正如我最初的想法。
HiddenFor()
的调用跟踪的代码堆栈是(我认为);
System.Web.Mvc.InputExtentions.HiddenFor()
(公共(public)功能)System.Web.Mvc.InputExtentions.HiddenHelper()
(私有(private)函数,这里有一些用于数组的逻辑,但不适用于我们的情况)System.Web.Mvc.InputExtentions.InputHelper()
(私有(private)函数,魔法在这里发生)System.Web.Mvc.InputExtentions.InputHelper()
的反编译代码;
private static MvcHtmlString InputHelper(HtmlHelper htmlHelper, InputType inputType, ModelMetadata metadata, string name, object value, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, string format, IDictionary<string, object> htmlAttributes)
{
string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
if (string.IsNullOrEmpty(fullHtmlFieldName))
{
throw new ArgumentException(MvcResources.Common_NullOrEmpty, "name");
}
TagBuilder tagBuilder = new TagBuilder("input");
tagBuilder.MergeAttributes<string, object>(htmlAttributes);
tagBuilder.MergeAttribute("type", HtmlHelper.GetInputTypeString(inputType));
tagBuilder.MergeAttribute("name", fullHtmlFieldName, true);
string text = htmlHelper.FormatValue(value, format);
bool flag = false;
switch (inputType)
{
case InputType.CheckBox:
{
bool? flag2 = htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(bool)) as bool?;
if (flag2.HasValue)
{
isChecked = flag2.Value;
flag = true;
}
break;
}
case InputType.Hidden:
goto IL_131;
case InputType.Password:
if (value != null)
{
tagBuilder.MergeAttribute("value", text, isExplicitValue);
goto IL_16C;
}
goto IL_16C;
case InputType.Radio:
break;
default:
goto IL_131;
}
if (!flag)
{
string text2 = htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string)) as string;
if (text2 != null)
{
isChecked = string.Equals(text2, text, StringComparison.Ordinal);
flag = true;
}
}
if (!flag && useViewData)
{
isChecked = htmlHelper.EvalBoolean(fullHtmlFieldName);
}
if (isChecked)
{
tagBuilder.MergeAttribute("checked", "checked");
}
tagBuilder.MergeAttribute("value", text, isExplicitValue);
goto IL_16C;
IL_131:
string text3 = (string)htmlHelper.GetModelStateValue(fullHtmlFieldName, typeof(string));
tagBuilder.MergeAttribute("value", text3 ?? (useViewData ? htmlHelper.EvalString(fullHtmlFieldName, format) : text), isExplicitValue);
IL_16C:
if (setId)
{
tagBuilder.GenerateId(fullHtmlFieldName);
}
ModelState modelState;
if (htmlHelper.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out modelState) && modelState.Errors.Count > 0)
{
tagBuilder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
tagBuilder.MergeAttributes<string, object>(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));
if (inputType == InputType.CheckBox)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(tagBuilder.ToString(TagRenderMode.SelfClosing));
TagBuilder tagBuilder2 = new TagBuilder("input");
tagBuilder2.MergeAttribute("type", HtmlHelper.GetInputTypeString(InputType.Hidden));
tagBuilder2.MergeAttribute("name", fullHtmlFieldName);
tagBuilder2.MergeAttribute("value", "false");
stringBuilder.Append(tagBuilder2.ToString(TagRenderMode.SelfClosing));
return MvcHtmlString.Create(stringBuilder.ToString());
}
return tagBuilder.ToMvcHtmlString(TagRenderMode.SelfClosing);
}
最佳答案
看来我错了,毕竟是 JS,虽然不是在我试图排除它的时候。重现这一点的事件序列;
form
带有 bool 隐藏字段 + 非提交按钮 onclick
按钮的事件,有一段 JS 将 bool 字段设置为 true
(小写)HiddenFor()
(及其变体)将呈现来自
ViewData.ModelState
的 bool 值而不是模型属性的
ToString()
如果 key 存在于
ModelState
中,则值收藏。看起来很直观,但可以(对我来说)可以抛出的是所有其他数据类型,模型绑定(bind)器非常具体 -
ModelState
value 和您模型的属性值将相同。除了 bool 值 - 模型绑定(bind)器足够智能来处理
True
和
true
与转换 POST 时相同,但这会留下
ModelState
如果它是通过 JS bool 值设置的,则 value 和您的字符串化属性值不正常。 JS 会设置
ModelState
值为
true
而您的模型属性的
ToString()
值显示为
True
.而在 JS 中,
"true" !== "True"
.
HiddenFor
调用模型属性的
.ToString()
而不是从
ModelState
中拉出来因为在那个时间点它不在那里。同样,在我的测试中,用户会在通过 JS 设置之后很久才处于向导中的某个点,因此当他们继续通过向导时,它会保持大写。
ModelState
在页面生命周期中持续存在。 .去搞清楚。
public class Test
{
public bool Sample { get; set; }
}
@model TestModelValueCase.Models.Test
@{
ViewBag.Title = "Test Page";
}
@using (Html.BeginForm())
{
@Html.HiddenFor(m => m.Sample)
<div>
<label>Hidden Value:</label>
<span id="_uiValue"></span>
</div>
<button type="submit">Try Post</button>
}
@section scripts
{
<script type="text/javascript" language="javascript">
$(document).ready(function() {
var source = $('#@nameof(Model.Sample)');
$('#_uiValue').html(source.val());
source.val(true);
});
</script>
}
public ActionResult Index()
{
Test model = new Test();
return View(model);
}
[HttpPost]
public ActionResult Index(Test model)
{
return View(model);
}
关于c# - 不同情况下呈现的 bool 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720485/
我有一个 aspx 应用程序。在每个 GET 中,服务器以包含除表格网格之外的所有内容的“基本”html 进行响应。 这个“网格信息”包含在页面中隐藏的输入类型(json 格式)中。 这是设计使然,无
阅读有关 iOS 中 UIViewControllers 更改的文档,我试图弄清楚呈现模态视图 Controller 之间的交互如何在自定义容器 View Controller 内工作。最终,我希望能
我正忙于编写自己的 JSF2 UIComponent 及其相关的渲染器。我所有的 UIComponent 都实现了 ClientBehaviorHolder。我不明白的是如何真正呈现 ClientBe
我正在开发一个使用UIPopoverController的应用程序,我在呈现该弹出窗口时遇到问题,我有一个添加在self.view上的UIView,并在该 View 上添加了一个表格 View ,该表
我有一个简单的应用程序,我想在用户首次登录应用程序时在其中显示一个 PageViewController。他们查看教程后,在下一次加载时不会显示 PageViewController。 但是我收到了以
我正在尝试制作一个小型的backbone.js 应用程序,但在事情的顺序上很挣扎。 在我的 html 文件中,标题中有两个脚本 block : jQuery(function(){
我有一个以模型为来源的表格: $form->setModel("test"); 在模型中,我们可以定义字段类型,例如:boolean 将在表单中制作复选框。 现在我们如何定义呈现为单选按钮的类型? 最
fabricJS 版本 2.2.3 测试 jsFiddle 我正在尝试使用 LabeledRect 子类,但我的问题是,每当我尝试从 JSON 加载它时,它都不会呈现,并且在控制台中也没有出现错误。请
在我的 Xaml 中,我定义了一个资源作为 vehicleDataInput,它提供一些文本框供用户输入数据。如果我没有为它定义一个 x:Key ,它将在我的应用程序中出现并按其应有的方式工作。问题是
我在 React 中创建了一个 Symbol 组件来轻松呈现 HTML Symbols像 euro 这样的名字将呈现 €(€) 或 sum 呈现 ∑(∑). 问题是,如果我只渲染 HTML 代码,我将
我尝试渲染一个 View ,该 View 工作正常,但似乎无法获得传递给它的模型对象。我不知道原因,因为根据所有手册和示例,这应该非常简单。 模型对象 class Race { def dis
我正在尝试为Grails项目添加一个简单功能,类似于youtube,它将允许用户喜欢/不喜欢文章。有一个非常原始的页面来显示带有喜欢的文章和一个使“喜欢”成为可能的 Controller 。 las,
我的应用程序中的第一个 ViewController 子类 UIImagePickerController 然后通过 didFinishPickingMediaWithInfo 回调,我执行以下操作:
我正在做一个简单的 redux/react todo 应用程序。我无法显示待办事项。我能够 console.log 数据,但无法显示它。我做错了什么? 我把文件分开了,这是我的app.js: impo
我正在尝试呈现一个导航 Controller ,它似乎可以工作并呈现导航 Controller 。但是,即使它有效,我仍然不断收到错误? 我的代码 let vc = storyboard.instan
我正在重新创建一个简单版本的 snapchat 应用程序,但遇到了一个恼人的小问题,我似乎无法找到解决办法。 我查看了一些答案,例如 this one但没有运气。 总体概念与 snapchat 用户单
我在呈现警报时遇到问题。我正在使用 UIAlertController。当用户按下提交按钮时,在应用程序执行某些操作时,需要立即显示“请稍候..”的警报。操作完成后,警报将消失。尽管应该在我开始执行操
我只是想用 Kinetic 渲染图像,但没有出现,也没有出现错误。 可以找到 fiddle here . 源代码: $( function() { var stage = new Kineti
我正在使用 Phantomjs 检查我的应用程序。我正在查看的页面包含很多组件,并且由 Angularjs 提供支持。我的测试服务器很慢。在 onLoadFinished 事件中,我使用渲染对网页进行
我有一个变量,它的字符串包含我所有的文档,如下所示: var string = " ReportHelloWorld"; 我想打开一个正确插入和显示此报告的新页面,但不知道如何操作。我该怎么办? 感谢
我是一名优秀的程序员,十分优秀!