首页 / 知识

关于asp.net mvc:如何覆盖HTML帮助器方法用于模型属性的字符串表示形式?

2023-04-16 15:48:00

关于asp.net mvc:如何覆盖HTML帮助器方法用于模型属性的字符串表示形式?

How do you override the string representation the HTML helper methods use for a model’s properties?

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

控制器动作中的所需代码

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

View中所需的代码

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

1
2
3
<%=Html.TextBox("Date") %>
<%=Html.TextBox("Time") %>
<%=Html.TextBox("UnitPrice") %>

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

对于文本框的值,模型实例中的UnitPrice属性的值将转换为字符串。我需要通过自己转换为字符串来覆盖此行为,该字符串是针对每个属性的,而不是针对每种类型的。例如,对于UnitPrice,我需要使用不同的字符串表示形式,对于UnitQuantity,我需要使用另一种字符串表示形式的十进制形式。

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

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

请进行2路数据绑定

就像IModelBinder是模型的每个属性的解析一样,我需要为每个属性设置一个Format,有点像Windows Forms绑定,但是基于模型而不是控件。这将使模型能够往返并具有正确的格式。我希望可以覆盖默认格式的设计。另外,我的模型在单独的程序集中,因此指定格式化程序的属性不是选项。

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


无法使用助手自己来指定格式。您采用的方法将起作用。另一种方法是将预先格式化的值添加到ModelState

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

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

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

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

我敢肯定有一种简便的方法可以渲染" $ "而无需对其进行硬编码,因此它可以本地化,但是我不知道它是副产品。

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

Well, to be fair, this isn’t that bad.
Often when you format a number or a
date it’s still understandable coming
back in. For example, padding a
number (like a ZIP code) to 5 digits,
padding a decimal to the hundredths,
formatting a date to be yyyy-mm-dd,
etc. will come in just fine. Adding
extra characters like currency symbols
will break, but normally input fields
don’t take or display currency symbols
anyway – it’s implied.


方法用于字符串属性

最新内容

相关内容

猜你喜欢