12、新特性之 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来实现上面我们提出的情况。代码如下:

ContractedBlock.gif ExpandedBlockStart.gif 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 入门系列中下载。

转载于:https://www.cnblogs.com/bitstudio/archive/2009/03/15/1412414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值