新しくリリースされたASP.NET MVCベータ版では、UpdataModel方法でIValueProviderパラメータを使用して重い負荷を提供します。さて、このIValueProviderはそれが何を使用ですか?
そのような私たちのブログシステムなどの単純なシナリオ、で見てみましょうが、ポストの目標を持って、Postオブジェクトはプロパティタグとカテゴリのプロパティがあり、その種類は次のとおりです。
Post.Tags:StateList <文字列>(リスト<T>は拡張型BlogEngine.NETです)
Post.Categories:statelist <カテゴリ>
私達は私達の記事の件名に私達のポストフォームの上にフォームデータに更新するUpdataModelメソッドを使用する場合は、次のコードがあるかもしれません。
/// <要約>
保存上のデータベースに提出新しいコンテンツ//エッセイ形態
/// </要約>
[AcceptVerbs( "POST")、ACTIONNAME( "newPost")]
公共のActionResult SaveNewPost(FormCollection形)
{
POST POST =新しい新しいポスト();
試み
{
のUpdateModel(POST、新しい新しい[] { "タイトル"、 "ナメクジの" "コンテンツ"、 "タグ"、 "カテゴリー"});
}
キャッチ
{
リターンビュー(POST);
}
...
}
明らかに、上記のコードでは、我々はのUpdateModelメソッドは、「タグ」と「カテゴリー」StateListへのデータの上にフォームを提出する方法を知らないので、成功する可能性は低いときタグとカテゴリプロパティを更新するためのUpdateModelを使用します<文字列>タイプとstateList <カテゴリ>タイプ。今回は、この変換を実行するために、ValueProviderを提供する必要があります。
ValueProviderを達成するために、我々は唯一のGetValueメソッドIValueProviderインターフェイスを実装する必要があり、その上にValueProviderResultの結果を返します。ここでは、私たちの提案上記の達成にPostValueProviderを書きます。コードは以下の通りであります:
パブリッククラスPostValueProvider:IValueProvider
{
プライベートControllerContextコンテキスト。
//プライベートDefaultValueProvider dProvider。
公共PostValueProvider(ControllerContextコンテキスト)
{
this.context =文脈。
// dProvider =新しいDefaultValueProvider(コンテキスト)。
}
#region IValueProvider成员
公共ValueProviderResult GetValueメソッド(文字列名)
{
(string.IsNullOrEmpty(名))であれば
{
新しいArgumentExceptionが( "参数不能为空"、 "名")を投げます。
}
スイッチ(名)
{
場合"タグ":
リターンGetTagsValue()。
ケース"カテゴリー":
リターンGetCategoriesValue();
デフォルト:
リターン新しいDefaultValueProvider(コンテキスト)以降.getvalue(名);
}
}
#endregion
プライベートValueProviderResult GetTagsValue()
{
ストリングstrTags = GetValueFromRequest( "タグ")。
IF(string.IsNullOrEmpty(strTags))
{
戻りヌル。
}
文字列[]タグ= strTags.Split(新しい文字列[] { ""}、StringSplitOptions.RemoveEmptyEntries)。
StateList <文字列> tagsList =新しいStateList <文字列>();
foreachの(タグの文字列タグ)
{
tagsList.Add(tag.Trim()ToLowerInvariant()。)。
}
新しいValueProviderResult(tagsList、strTags、CultureInfo.InvariantCulture)を返します。
}
プライベートValueProviderResult GetCategoriesValue()
{
ストリングstrCategories = GetValueFromRequest( "カテゴリ")。
IF(string.IsNullOrEmpty(strCategories))
{
戻りヌル。
}
文字列[]カテゴリ= strCategories.Split(新しい文字列[] { ""}、StringSplitOptions.RemoveEmptyEntries)。
StateList <カテゴリ>リスト=新しいStateList <カテゴリ>();
foreachの(カテゴリの列c)
{
list.Add(Category.GetCategory(新しいGUID(C)));
}
新しいValueProviderResult(リスト、strCategories、CultureInfo.InvariantCulture)を返します。
}
プライベートストリングGetValueFromRequest(列名)
{
文字列値= NULL;
HttpRequestBase要求= context.HttpContext.Request。
IF(!リクエスト= NULL)
{
IF(!場合、Request.QueryString = NULL)
{
値=場合、Request.QueryString [名前]。
}
IF(string.IsNullOrEmpty(値)&&(のRequest.Form = NULL)!)
{
値=のRequest.Form [名前]。
}
}
の値を返します。
}
}
その後、我々はのUpdateModel方法で私たちのPostValueProviderを使用することができます。
/// <要約>
保存上のデータベースに提出新しいコンテンツ//エッセイ形態
/// </要約>
[AcceptVerbs( "POST")、ACTIONNAME( "newPost")]
公共のActionResult SaveNewPost(FormCollection形)
{
POST POST =新しい新しいポスト();
試み
{
のUpdateModel(POST、新しい新しい[] { "タイトル"、 "ナメクジの" "コンテンツ"、 "タグ"、 "カテゴリー"}、新しい新PostValueProvider(ControllerContext));
}
キャッチ
{
リターンビュー(POST);
}
...
}
で!ポストをお楽しみください Q.Lee.lulu。
あなたはより多くのASP.NET MVCについて知りたい場合は、参照することができますASP.NET MVCは、シリーズをはじめ、我々はからのサンプルコードもでき、上のASP.NET MVCシリーズダウンロード。