如何覆盖HTML帮助器方法用于模型属性的字符串表示?

时间:2008-09-17 15:23:23

标签: asp.net-mvc

html帮助器方法检查ViewDataDictionary的值。该值可以作为属性在字典中或在模型中。要提取值,名为ViewDataEvaluator的内部密封类使用PropertyDescriptor来获取值。然后,调用Convert.ToString()将返回的对象转换为字符串。

Controller action

中的所需代码

控制器操作应仅填充模型,而不是格式化(格式化模型是全局的)。

View中的所需代码

视图可以呈现HTML文本框,并使用以下代码行提取属性的字符串表示形式:

<%=Html.TextBox(“Date”) %>
<%=Html.TextBox(“Time”) %>
<%=Html.TextBox(“UnitPrice”) %>

绑定模型的属性为HtmlHelper.TextBox()

对于文本框的值,来自模型实例的UnitPrice属性值将转换为字符串。我需要使用我自己的转换为字符串来覆盖此行为,该字符串是每个属性 - 不是每种类型。例如,我需要的小数作为单价的不同串表示和的小数作为UnitQuantity的另一个字符串表示。

例如,我需要根据市场格式化UnitPrice的小数精度。

string decimalPlaces = ViewData.Model.Precision.ToString ();
<%=Html.TextBox(“UnitPrice”, ViewData.Model.TypeName.UnitPrice.ToString("N" + decimalPlaces)) %>

双向数据绑定

就像IModelBinder是解析为模型的每个属性,我需要的格式的每个属性,有点像Windows窗体binding,但基于模型而不是控件。这将使模型能够往返并具有适当的格式。我更喜欢我可以覆盖默认格式的设计。此外,我的模型位于单独的程序集中,因此指定格式化程序的属性属性不是一个选项。

请注意,我需要为模型设置特定于属性的格式,而不是特定类型格式。

1 个答案:

答案 0 :(得分:3)

无法使用帮助程序本身指定格式。你采取的方法将起作用。另一种方法是将预格式化的值添加到ModelState

编辑:您确定要使用货币格式化文本输入吗?例如,您在输入中看到的是:

<input type="text" name="UnitPrice" value="$1.23" />

当您将其发回服务器时,我们将无法理解它。相反,我将货币符号放在文本输入的之外。例如:

$<%= Html.TextBox("UnitPrice") %>

我确信有一种简单的方法可以渲染“$”而无需对其进行硬编码,因此它可以进行本地化,但我不知道它是什么。

再次编辑 我团队的开发人员的评论:

  

嗯,公平地说,这并不是那么糟糕。   通常在格式化数字或a时   约会,它仍然可以理解   回来。例如,填充a   数字(如邮政编码)到5位数,   将小数填充到百分之一,   将日期格式化为yyyy-mm-dd,   等等会好起来的。添加   额外的字符,如货币符号   会破坏,但通常输入字段   不要采取或显示货币符号   无论如何 - 这是隐含的。