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是解析为模型的每个属性,我需要的格式的每个属性,有点像Windows窗体binding,但基于模型而不是控件。这将使模型能够往返并具有适当的格式。我更喜欢我可以覆盖默认格式的设计。此外,我的模型位于单独的程序集中,因此指定格式化程序的属性属性不是一个选项。
请注意,我需要为模型设置特定于属性的格式,而不是特定类型格式。
答案 0 :(得分:3)
无法使用帮助程序本身指定格式。你采取的方法将起作用。另一种方法是将预格式化的值添加到ModelState
。
编辑:您确定要使用货币格式化文本输入吗?例如,您在输入中看到的是:
<input type="text" name="UnitPrice" value="$1.23" />
当您将其发回服务器时,我们将无法理解它。相反,我将货币符号放在文本输入的之外。例如:
$<%= Html.TextBox("UnitPrice") %>
我确信有一种简单的方法可以渲染“$”而无需对其进行硬编码,因此它可以进行本地化,但我不知道它是什么。
再次编辑 我团队的开发人员的评论:
嗯,公平地说,这并不是那么糟糕。 通常在格式化数字或a时 约会,它仍然可以理解 回来。例如,填充a 数字(如邮政编码)到5位数, 将小数填充到百分之一, 将日期格式化为yyyy-mm-dd, 等等会好起来的。添加 额外的字符,如货币符号 会破坏,但通常输入字段 不要采取或显示货币符号 无论如何 - 这是隐含的。