MVC4 Model ValueProvider

1. NameValueCollectionValueProvider:

ValueProvider 的数据容器一般具有类似字典的结构。NameValueCollection 表示一种 key 和value 均为字符的字典。

方法 GetKeysFromPrefix  以字典的形式返回数据源容器中所有具有指定前缀的key。

   两种前缀的形式:

  两种前缀形式辅助实现Model绑定数据。

  一种是采用"." 一种是采用"[]" 集合的方式:

        public ActionResult Index()
        {
            NameValueCollection datasource = new NameValueCollection();

            datasource.Add("foo.Name", "Foo");
            datasource.Add("foo.PhoneNo", "123456789");
            datasource.Add("foo.EmailAddress", "[email protected]");

            datasource.Add("foo.Address.Province", "江苏");
            datasource.Add("foo.Address.City", "苏州");
            datasource.Add("foo.Address.District", "工业园区");
            datasource.Add("foo.Address.Street", "星湖街328号");

            NameValueCollectionValueProvider valueProvider = new NameValueCollectionValueProvider(datasource, CultureInfo.InvariantCulture);
            return View(valueProvider);
        }
@model NameValueCollectionValueProvider
<html>
<head>
    <title>指定前缀的Key</title>
    <link rel="stylesheet"  href="~/Style.css" />
</head>
<body>
    <table rules="all">
        <tr><th colspan="2">foo</th></tr>
        @foreach (var item in Model.GetKeysFromPrefix("foo"))
        {
            <tr><td>@item.Key</td><td>@item.Value</td></tr>
        }

        <tr><th colspan="2">foo.Address</th></tr>
        @foreach (var item in Model.GetKeysFromPrefix("foo.Address"))
        {
            <tr><td>@item.Key</td><td>@item.Value</td></tr>
        }
    </table>
</body>
</html>

现在来看看数组"[]"形式的代码:

        public ActionResult Index()
        {
            NameValueCollection datasource = new NameValueCollection();

            datasource.Add("first[0].Name", "Foo");
            datasource.Add("first[0].PhoneNo", "123456789");
            datasource.Add("first[0].EmailAddress", "[email protected]");

            datasource.Add("first[1].Name", "Bar");
            datasource.Add("first[1].PhoneNo", "987654321");
            datasource.Add("first[1].EmailAddress", "[email protected]");

            NameValueCollectionValueProvider valueProvider = new NameValueCollectionValueProvider(datasource, CultureInfo.InvariantCulture);

            return View(valueProvider);
        }
@model NameValueCollectionValueProvider
<html>
<head>
    <title>指定前缀的Key</title>
    <link rel="stylesheet"  href="~/Style.css" />
</head>
<body>
    <table>
        <tr><th colspan="2">first</th></tr>
        @foreach (var item in Model.GetKeysFromPrefix("first"))
        {
            <tr><td>@item.Key</td><td>@item.Value</td></tr>
        }

        <tr><th colspan="2">first[0]</th></tr>
        @foreach (var item in Model.GetKeysFromPrefix("first[0]"))
        {
            <tr><td>@item.Key</td><td>@item.Value</td></tr>
        }

        <tr><th colspan="2">first[1]</th></tr>
        @foreach (var item in Model.GetKeysFromPrefix("first[1]"))
        {
            <tr><td>@item.Key</td><td>@item.Value</td></tr>
        }
    </table>

</body>
</html>

2. DictionaryValueProvider: 是将数据源存放在真正的字典对象之中。他们之间不同之处在于NameValueCollection 中的元素仅局限于字符串。

        public ActionResult DataOfChildActionValueProvider()
        {
            ControllerContext.RouteData.Values["Foo"] = "abc";
            ControllerContext.RouteData.Values["Bar"] = "ijk";
            ControllerContext.RouteData.Values["Baz"] = "xyz";

            ChildActionValueProvider valueProvider = new ChildActionValueProvider(ControllerContext);
            return View(valueProvider);
        }
@model ChildActionValueProvider
<table rules="all">
    <tr>
        <th>Key</th><th colspan="2">Value</th>
    </tr>
    @{
        var dictionary1 = this.Model.GetDataSource();
    }
    @foreach (var item1 in dictionary1)
    {

        DictionaryValueProvider<object> valueProvider = item1.Value.RawValue as DictionaryValueProvider<object>;
        if (null == valueProvider)
        {
            <tr>
                <td>@item1.Key</td><td colspan="2">@item1.Value.RawValue</td>
            </tr>
        }
        else
        {
            var dictionary2 = valueProvider.GetDataSource();
            <tr>
                <td rowspan="@(dictionary2.Count + 1)">@item1.Key</td>
                <th>Key</th><th>Value</th>
            </tr>
            foreach(var item2 in dictionary2)
            {
                <tr><td>@item2.Key</td><td>@item2.Value.RawValue</td></tr>
            }
        }
    }
</table>

同时在Index 中

<html>
<head>
    <title>ChildActionValueProvider的数据结构</title>
    <link rel="stylesheet"  href="~/Style.css" />
</head>
<body>
    @Html.Action("DataOfChildActionValueProvider", new { Foo = 123, Bar = 456, Baz = 789 })
</body>
</html>
时间: 2024-12-19 09:49:06

MVC4 Model ValueProvider的相关文章

MVC4 Model ControllerDescriptor

1. ControllerDescriptor 的描述 Controller  的Action 方法有以下一些特性: 1.1 ActionNameAttribute特性  他继承自 System.Web.Mvc.ActionNameSelectorAttribute 抽象类 ActionNameSelectorAttribute  通过 其 抽象方法 IsValidName 判断指定的Action名称是否与目标Action方法相匹配.   如下代码片段: 添加了 ActionNameAttrib

白话学习MVC(六)模型绑定

一.什么是模型绑定? 模型绑定存在的意义就是为Action的参数提供值,例如:如下表单中提交了数据,那么Action(即:Index)的参数Id,Name的值就是表单中对应的name属性相同的值,而表单提交的值是如何赋值给Action的参数的呢?模型绑定就是来完成从用户提交的请求中提取数据,并赋值给Action的参数.此例是从表单中的提取数据,并赋值给Action的参数,模型绑定还可以完成完成从地址Url.路由Route.上传文件等中获取数据,并赋值给Action相应的参数. <form id=

ModelBinder

MVC Form表单的value就会自动匹配到Action的参数中,是如何实现的呢? 通过 反编译System.Web.Mvc.dll, 从Controller入手,会发现Controller中的执行核心ExcuteCore()中会InvokeAction 这里ActionInvoker是一个ControllerActionInvoker对象中调用了GetPrameterValues方法 ActionDescriptor的作用是对Action方法的元数据的描述,通过ActionDescripto

asp.net mvc4中model与Model的区别

@model模型定义 使用@model关键字可以定义一个Action里所对应的一个模型(经常可以叫他实体类), 其实是对动态变量进行实例化,这样就可以直接在cshtml文件中调用“Model”变量. 而这个模型的实例,需要通过Controller进行传输,如果没有则“Model”将为null. 模型可以是一个实体类,也可以是一个列表实例,字典对象都可以进行定义,但是和 Controller中的Action传回来的实例一定要一样,否则将会出现错误. Model 定义 MVC的第一个字母M是Mode

MVC4 中的Model显示设置(含显示Shared/DisplayTemplates和编辑Shared/EditorTemplates)

虽然 [Display(Name="XXX")]已经能在页面中@Html.LabelFor(m=m.属性)中显示其值,但是不够灵活,特别是在@Html.EtitorForModel()或@Html.DisplayForModel()时,我们想要根据自己的要求来显示信息,那么我们就要根据情况 实现步骤如下: 1. 在View 下的shared文件夹下添加EditorTemplates文件夹 2.在EditorTemplates 添加视图(不继承任何模板)  如添加 视图 YesOrNo.

【MVC版本】MVC3、MVC4之MODEL验证大比拼

1.密码验证 MVC3 [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "密码和确认密码不匹配.")] MVC4 [System.Web.Mvc.Compare("Password", ErrorMessage = "密码和确认密码不匹配.")]

MVC4笔记 @functions @model @using

/////@functions自定义函数////// @helper辅助方法的确可以很方便的完成辅助方法开发,不过却失去了一些弹性,例如,无法在@helper中自定义属性,只能单纯的传入参数,然后格式化成你想要的样子后直接输出,因此razor还提供了@functions自定义函数功能,能够让你用接近c#类别的方式进一步定义为更复杂的辅助方法. 必须先通过@functions定义出一个代码区块,然后把c#方法写在里面,如果该方法必须将执行结果回传到view页面上的话,则必须以IHtmlString

asp.net mvc4.0 一个View返回多个实体(Model)

view:               Contro:

MVC4 + EF为Model添加单独的验证属性

可使用以下方式给Model加上相关的meta验证属性,这样实体的验证属性就不会被例如EF或其他工具自动生成的Model所替换了. using System.ComponentModel.DataAnnotations; namespace IDO.Entities {  [MetadataType(typeof(CustomerMetadata))]  partial class Customer  {  } public class CustomerMetadata  {   [Require