日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC Beta 新特性之 IValueProvider

發布時間:2025/3/20 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC Beta 新特性之 IValueProvider 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在剛發布的ASP.NET MVC Beta版中,在UpdataModel方法中提供了一個帶有IValueProvider參數的重載。那么這個IValueProvider有什么用呢?

我們先來看一個簡單的場景,例如我們的blog系統有一個Post的對象,Post對象有一個Tags屬性和Categories屬性,他們的類型分別是:

Post.Tags?:?StateList<string>?(BlogEngine.NET?中的一個List<T>的擴展類型)
Post.Categories?:?StateList
<Category>

?

假如我們要使用UpdataModel方法來對我們Post過來的Form表單數據更新到我們的Post對象中,可能會有如下的代碼:

///?<summary>
///?將提交過來的新隨筆表單內容保存到數據庫
///?</summary>
[AcceptVerbs("POST"),?ActionName("NewPost")]
public?ActionResult?SaveNewPost(FormCollection?form)
{
????Post?post?
=?new?Post();
????
try
????{
????????UpdateModel(post,?
new[]?{?"Title",?"Content",?"Slug",?"Tags",?"Categories"?});
????}
????
catch
????{
????????
return?View(post);
????}?
????..
}?

很明顯,在上面的代碼中,我們用UpdateModel來更新Tags和Categories屬性的時候,是不可能成功的,因為UpdateModel方法不知道怎樣將Form提交過來的"Tags"和"Categories"數據轉換為StateList<string>類型和StateList<Category>類型。這時候就需要我們提供一個ValueProvider,來進行這個轉換。

要實現一個ValueProvider,我們只需要實現IValueProvider接口的GetValue方法,并且返回一個ValueProviderResult的結果就可以了。下面我們就寫一個PostValueProvider來實現上面我們提出的情況。代碼如下:

PostValueProvider
public?class?PostValueProvider?:?IValueProvider
{
????
private?ControllerContext?context;
????
//private?DefaultValueProvider?dProvider;?

????
public?PostValueProvider(ControllerContext?context)
????{
????????
this.context?=?context;
????????
//dProvider?=?new?DefaultValueProvider(context);
????}?

????
#region?IValueProvider?成員?

????
public?ValueProviderResult?GetValue(string?name)
????{
????????
if?(string.IsNullOrEmpty(name))
????????{
????????????
throw?new?ArgumentException("參數不能為空",?"name");
????????}
????????
switch?(name)
????????{
????????????
case?"Tags":
????????????????
return?GetTagsValue();
????????????
case?"Categories":
????????????????
return?GetCategoriesValue();
????????????
default:
????????????????
return?new?DefaultValueProvider(context).GetValue(name);
????????}
????}?

????
#endregion?

????
private?ValueProviderResult?GetTagsValue()
????{
????????
string?strTags?=?GetValueFromRequest("Tags");
????????
if?(string.IsNullOrEmpty(strTags))
????????{
????????????
return?null;
????????}?

????????
string[]?tags?=?strTags.Split(new?string[]?{?","?},?StringSplitOptions.RemoveEmptyEntries);
????????StateList
<string>?tagsList?=?new?StateList<string>();
????????
foreach?(string?tag?in?tags)
????????{
????????????tagsList.Add(tag.Trim().ToLowerInvariant());
????????}?

????????
return?new?ValueProviderResult(tagsList,?strTags,?CultureInfo.InvariantCulture);
????}?

????
private?ValueProviderResult?GetCategoriesValue()
????{
????????
string?strCategories?=?GetValueFromRequest("Categories");
????????
if?(string.IsNullOrEmpty(strCategories))
????????{
????????????
return?null;
????????}?

????????
string[]?categories?=?strCategories.Split(new?string[]?{?","?},?StringSplitOptions.RemoveEmptyEntries);
????????StateList
<Category>?list?=?new?StateList<Category>();
????????
foreach?(string?c?in?categories)
????????{
????????????list.Add(Category.GetCategory(
new?Guid(c)));
????????}?

????????
return?new?ValueProviderResult(list,?strCategories,?CultureInfo.InvariantCulture);
????}?

????
private?string?GetValueFromRequest(string?name)
????{
????????
string?value?=?null;
????????HttpRequestBase?request?
=?context.HttpContext.Request;
????????
if?(request?!=?null)
????????{
????????????
if?(request.QueryString?!=?null)
????????????{
????????????????value?
=?request.QueryString[name];
????????????}
????????????
if?(string.IsNullOrEmpty(value)?&&?(request.Form?!=?null))
????????????{
????????????????value?
=?request.Form[name];
????????????}
????????}?

????????
return?value;
????}
}?

然后我們就可以在UpdateModel方法中使用我們的PostValueProvider了:

?

///?<summary>
///?將提交過來的新隨筆表單內容保存到數據庫
///?</summary>
[AcceptVerbs("POST"),?ActionName("NewPost")]
public?ActionResult?SaveNewPost(FormCollection?form)
{
????Post?post?
=?new?Post();
????
try
????{
????????UpdateModel(post,?
new[]?{?"Title",?"Content",?"Slug",?"Tags",?"Categories"?},?new?PostValueProvider(ControllerContext));
????}
????
catch
????{
????????
return?View(post);
????}?

???..
}?

Enjoy!Post by Q.Lee.lulu.

如果你想了解更多關于ASP.NET MVC的內容,可以參考ASP.NET MVC 入門系列,本文示例代碼也可以從ASP.NET MVC 入門系列中下載。

總結

以上是生活随笔為你收集整理的ASP.NET MVC Beta 新特性之 IValueProvider的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。