ASP.NET MVC Beta 新特性之 IValueProvider

來源:互聯網
上載者:User

在剛發布的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 入門系列中下載。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.