1

小さなトレーニング ASP .Net Web アプリケーションを開発しています。
データ バインディングを介して ObjectDataSource にリンクされた FormView コントロールを宣言した ASPX ページを開発しました。
update メソッドは Product オブジェクトを受け取ります。
Product オブジェクトには、double 値を含むプロパティ Price があります。

ユーザーは、FormView を介して製品の読み取り、更新、削除を作成できます。
ただし、製品を更新または挿入するときにエラーが発生する可能性があります。

より正確には、Product オブジェクトが FormView の入力値からインスタンス化されると、エラーが発生します。
Price プロパティに関連付けられた入力コントロールに含まれる文字列を double にキャストできませんでした。
たとえば、"50,6" は double にキャストできません。コマは小数点記号です。
おそらく EN-US カルチャを考慮しているため、ASP .Net は小数点記号のポイントを期待していると思います。

ブラウザで取得したスタック トレースは次のとおりです。

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
}

また、ブラウザーと OS の両方で、テスト クライアントのカルチャが "FR-FR" に設定されていることを確認します。MSDN は、解析のためにサーバーのカルチャの代わりにクライアントのカルチャを使用できることを説明しています。(彼らはインバリアント カルチャーについては議論しませんが、あなたは絶対にそれを望んでいません。)

これが機能しない場合、または .NET 4.0 以前を使用している場合は、(POCO またはパラメーターを使用しているかどうかに関係なく) InsertParameters を使用すると役立つ場合があります。

このスレッドを参照してください: 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 は文字列を DateTime に解析できません

于 2012-11-26T15:10:14.757 に答える