1

我正在开发一个小型培训 ASP .Net Web 应用程序。
我开发了一个 ASPX 页面,我在其中声明了一个通过数据绑定链接到 ObjectDataSource 的 FormView 控件。
update 方法接受一个 Product 对象。
Product 对象有一个包含双精度值的 Price 属性。

用户可以通过 FormView 创建读取更新删除产品。
但是在更新或插入产品时可能会引发错误。

更准确地说,当从 FormView 的输入值实例化 Product 对象时会引发错误。
与 Price 属性关联的输入控件中包含的字符串无法转换为双精度值。
例如,“50,6”不能转换为双精度。逗号是小数点分隔符。
我猜 ASP .Net 需要一个小数点分隔符,因为它可能考虑了 EN-US 文化。

这是我在浏览器中获得的堆栈跟踪:

System.ComponentModel.BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value) +489
System.Web.UI.WebControls.ObjectDataSourceView.ConvertType(Object value, Type type, String paramName) +117
System.Web.UI.WebControls.ObjectDataSourceView.BuildObjectValue(Object value, Type destinationType, String paramName) +167
System.Web.UI.WebControls.ObjectDataSourceView.BuildDataObject(Type dataObjectType, IDictionary inputParameters) +229
System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +1421
System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +95
System.Web.UI.WebControls.FormView.HandleUpdate(String commandArg, Boolean causesValidation) +1154
System.Web.UI.WebControls.FormView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +445
System.Web.UI.WebControls.FormView.OnBubbleEvent(Object source, EventArgs e) +95
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.FormViewRow.OnBubbleEvent(Object source, EventArgs e) +112
System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +125
System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +169
System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +9
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +176
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563

在通过数据绑定从字符串值设置对象属性时,是否可以指定要考虑的区域性?

4

1 回答 1

2

对于 .Net 4.5 及更高版本,这可能有效:

Page_Init(object sender, EventArgs e)
{
    MyObjectDataSource.ParsingCulture = ParsingCulture.Current;
                                                 //Invariant is en-US
}

此外,请确保测试客户端的文化设置为浏览器和操作系统的“FR-FR”。MSDN 解释说可以使用客户端的文化而不是服务器的文化进行解析。(他们不讨论不变的文化,但你绝对不想要它。)

如果这不起作用,或者您使用的是 .NET 4.0 或更早版本,则使用 InsertParameters 可能会有所帮助(无论您使用的是 POCO 还是参数):

看到这个线程:http ://forums.asp.net/t/963913.aspx/1

<asp:ObjectDataSource ...>
   ...
   <InsertParameters>
      <asp:Parameter Name="Birthdate" Type="DateTime" />
      <asp:Parameter Name="AnnualIncome" Type="Decimal" />
      <asp:Parameter Name="Height" Type="Double" />
   </InsertParameters>
</asp:ObjectDataSource ...>

编辑:有一个相关的堆栈溢出问题:ObjectDataSource failed to parse string to DateTime

于 2012-11-26T15:10:14.757 回答