2009-05-22 8 views
2

データベースに、深夜0時を格納する倍精度浮動小数点フィールドがあります。私は、この番号をHH:MM:SS.ffffffの形式に変換できるC#のコードを用意しています。ここで、fは秒数です。私はまた、これを二重に解析するコードを持っています。ASP.NET MVCでのカスタムバインディング - 単一のフィールドでのバインディング動作の変更

私がしたいのは、ASP.NET MVCのストックバインダーオブジェクトを変更して、通常、ダブルタイプから使用するものの代わりにMY解析とToString()メソッドを使用するようにします。完全なカスタムバインダー。

C#でいくつかの拡張メソッドを書くことができますか、バインドオブジェクトに私の解析とToString()メソッドを知らせるために適切な属性をいくつか使用できますか?

ここでもう少し説明します。

Linq to SQLクラスのようなモデルをビューに提供すると、MVCは私のビュー内のコントロールに同じ名前を使用していれば、フィールドを基になるデータモデルに自動的にワイヤリングできます私のデータモデル。 MVCビューをコントローラメソッドにポストした場合、ControllerクラスのUpdateModelメソッドを呼び出すことで、ユーザーの変更をデータベースに書き戻すことができます。 FormCollectionからLinqへの特定のフィールドをSQLデータクラスに配線することについては心配する必要はありません。

私はバインダーが通常の数値doubleでこの魔法を働かせるためには、おそらくdouble.parseを呼び出してユーザーからの入力を解析し、これをLinq to SQLに渡す必要があると仮定しますクラスを作成し、データベースを更新できるようにします。

私のモデルのフィールドの1つに対して、ダブルデータ型に付属するカスタムパーサを使用する必要があります。私は残りの分野の責任を引き受ける必要はありません。

+0

カスタムバインダーの作成に反対するのはなぜですか?このロジックのほとんどをクラスにカプセル化することができ、モデルバインダーは非常に簡単になります。 –

+0

これを行うには、他のフィールドごとにバインディングを引き継がなければなりませんか? –

+0

いいえ、そのタイプのアクションパラメータへのバインド用です。私はいくつかのコードを投稿しました。幸運 –

答えて

1

これは、ナイーブ迅速かつ汚い一例ですが、モデルバインダーのルートを行くことに決めた場合、何かしてみてください:

// This goes in global.asax 
ControllerBuilder.Current.SetControllerFactory(new ControllerFactory()); 
ModelBinders.Binders.Add(typeof(CustomDateType), new CustomDateBinder()); 

を例.ToCustomString()ために許容可能である場合、それは簡単です。 .....

public class CustomDateType 
{ 
    public CustomDateType(string value) 
    { 
    } 

    public string GetText() 
    { 
     // I do fancy stuff 
     throw new NotImplementedException(); 
    } 
    public decimal? GetValue() 
    { 
     // I do fancy stuff 
     throw new NotImplementedException(); 
    } 
} 

public class CustomDateBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     try 
     { 
      string doubleDateValue = GetAttemptedValue(bindingContext); 

      if (doubleDateValue == "") 
      { 
       return null; 
      } 

      return new CustomDateType(doubleDateValue); 
     } 
     catch (Exception ex) 
     { 
      string message = string.Format("Unable to locate a valid value for query string parameter '{0}'", 
             bindingContext.ModelName); 
      throw new ApplicationException(message, ex); 
     } 
    } 

    private static string GetAttemptedValue(ModelBindingContext bindingContext) 
    { 
     ValueProviderResult value = bindingContext.ValueProvider[bindingContext.ModelName]; 
     return value == null ? string.Empty : value.AttemptedValue; 
    } 
} 
+0

おかげさまで、ありがとう。やってみます。 –

0

名前は.ToString()であることが絶対に必要ですか?

public static class DoubleExtensions 
{ 
    public static string ToCustomString(this double d) 
    { 
     return "my own"; 
    } 
} 
+0

それはどんな文脈で使われていますか?テキストはどこに出力されますか(変更する方法で)? –

+0

しかし、MVCバインダーに、このメソッドを独自のメソッドではなく使用するように指示するにはどうすればよいですか? 実際、私はユーザーの入力を解析することをより心配しています。私はいつも表示のためにビューに書式設定を提供することができます。 –

+0

出力を変更する場所の.ToString()メソッドが呼び出されるサンプルコードを入力してください。サンプルコードがなければ、助けが非常に難しいです... –

関連する問題