html帮助器方法检查ViewDataDictionary的值。该值可以作为属性在字典中或在模型中。要提取值,名为ViewDataEvaluator的内部密封类使用PropertyDescriptor来获取值。然后,调用Convert.ToString()将返回的对象转换为字符串。
控制器操作应仅填充模型,而不是格式化(格式化模型是全局的)。
视图可以呈现HTML文本框,并使用以下代码行提取属性的字符串表示形式:
<%= Html.TextBox(“Date”)%>
<%= Html.TextBox(“Time”)%>
<%= Html.TextBox(“UnitPrice”)%>
对于文本框的值,来自模型实例的UnitPrice属性值将转换为字符串。我需要使用我自己的转换为字符串来覆盖此行为,该字符串是每个属性 - 不是每种类型。例如,我需要的是不同的字符串表示小数的单价和另一个字符串表示十进制的UnitQuantity。
例如,我需要根据市场格式化UnitPrice的小数精度。
string decimalPlaces = ViewData.Model.Precision.ToString();
<%= Html.TextBox(“UnitPrice”,ViewData.Model.TypeName.UnitPrice.ToString(“N”+ decimalPlaces))%>
就像IModelBinder是模型的每个属性的Parse一样,我需要每个属性的格式,有点像Windows Forms 绑定,但是基于模型而不是控件。这将使模型能够往返并具有适当的格式。我更喜欢我可以覆盖默认格式的设计。另外,我的模型是在一个单独的程序集中,因此指定格式化程序的属性属性不是一个选项。
请注意我需要特定于属性的模型格式,而不是特定于格式的格式。
发布于 2019-06-04 10:03:10
无法使用帮助程序本身指定格式。你采取的方法将起作用。另一种方法是将预先格式化的值添加到ModelState
。
编辑:你确定你甚至想用货币格式化文本输入吗?例如,您将在输入中看到的是:
<input type="text" name="UnitPrice" value="$1.23" />
当您将其发回服务器时,我们将无法理解它。相反,我将货币符号放在文本输入之外。例如:
$<%= Html.TextBox("UnitPrice") %>
我确信有一种简单的方法可以渲染“$”而无需对其进行硬编码,因此它可以进行本地化,但我不知道它是什么。
再次编辑 我的团队中的开发人员的评论:
嗯,公平地说,这并不是那么糟糕。通常,当您格式化数字或日期时,它仍然可以理解。例如,将数字(如邮政编码)填充为5位数,将小数位填充到百分之一,将日期格式化为yyyy-mm-dd,等等会好起来的。添加额外字符(如货币符号)将会中断,但通常输入字段无论如何都不会显示或显示货币符号 - 这是隐含的。
https://stackoverflow.com/questions/-100001229
复制相似问题