MVC 学习随笔(一)

Model的绑定。

(一)使用NameValueCollectionValueProvider

C# 对NameValueCollectionValueProvider的支持是通过下面的类实现的

// Library部分
 public class NameValueCollectionValueProvider : IUnvalidatedValueProvider, IValueProvider
{
// 构造函数
        public NameValueCollectionValueProvider(NameValueCollection collection, CultureInfo culture);
// 实现IValueProvider
    public virtual ValueProviderResult GetValue(string key);
// 省略
}

 [Serializable]
    public class ValueProviderResult
    {
        public object RawValue { get; protected set; }
        public object ConvertTo(Type type);

    }

Library部分

下面介绍一个简单的应用

// 应用部分
//Controller中定义NameValueCollectionValueProvider 作为显示Model传递给View
  NameValueCollection collection = new NameValueCollection();
            collection.Add("bar.Name", "John");
            collection.Add("bar.Age", "12");
            collection.Add("bar.Address.Street", "HongKang Street");
            collection.Add("bar.Address.ZipCode", "021");
            NameValueCollectionValueProvider nProvider = new NameValueCollectionValueProvider(collection, CultureInfo.CurrentCulture);
            var test = nProvider.GetValue("bar.Name");
            return View(nProvider);
 

Controller中传递Model

在View中接收来自Controller的传递

@Model NameValueCollectionValueProvider

<table>
        <tr>
            <th colspan="2">Bar</th>
        </tr>
        <tr>
            <td>bar.Name</td>
            <td>@Model.GetValue("bar.Name").ConvertTo(typeof(string))</td>
        </tr>
        <tr>
            <td>bar.Age</td>
            <td>@Model.GetValue("bar.Age").ConvertTo(typeof(string))</td>
        </tr>

        <tr>
            <th colspan="2">Bar.Address</th>
        </tr>
        <tr>
            <td>bar.Address.Street</td>
            <td>@Model.GetValue("bar.Address.Street").ConvertTo(typeof(string))</td>
        </tr>
        <tr>
            <td>bar.Address.ZipCode</td>
            <td>@Model.GetValue("bar.Address.ZipCode").ConvertTo(typeof(string))</td>
        </tr>
    </table>

RazoreView

继承自NameValueCollectionValueProvider的类有下面几个:

1.1: FormValueProvider 传递Form中控件的值

@using (Html.BeginForm("TestFormValueProvider", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <input type="text" name="testBox" value="" />
        <input type="submit" value="提交" title="提交" />
    }

View中提交表单

在Controller中将获取Form中提交的控件值

 public ActionResult TestFormValueProvider() {
            FormValueProvider form = new FormValueProvider(ControllerContext);
            var testBoxValue = form.GetValue("testBox");
            var outPut = testBoxValue.ConvertTo(typeof(string));
            Console.WriteLine(outPut);
            return null;
        }

Controller中获取

1.2: QueryStringValueProvider传递查询字符串

// HTML 代码片段
  <a href="@Url.Action("TestQueryStringProvider", "Home", new { Name="John Shen", Age="32"})" title="actionTest">测试URL QueryString传递Model</a>

View中添加anchor

Controller中获取View中的<a></a>的查询字符串

public ActionResult TestQueryStringProvider()
        {
            QueryStringValueProvider query = new QueryStringValueProvider(ControllerContext);
            var testNameQueryString = query.GetValue("Name").ConvertTo(typeof(string));
            var testAgeQueryString = query.GetValue("Age").ConvertTo(typeof(string));
            var testCompanyQueryString = query.GetValue("Company").ConvertTo(typeof(string));
            Console.WriteLine(testNameQueryString.ToString() + testAgeQueryString.ToString() + testCompanyQueryString.ToString());
            return null;
        }

Controller

(二)使用DictionaryValueProvider传递Model

NameValueCollectionValueProvider的是一个不对Key进行唯一性约束的键值列表,并且其Value只能是字符串。而DictionaryValueProvider才是真正意义上的键值对。Key有唯一性约束、Value可以是任何之。继承自DictionaryValueProvider的子类有以下几种

2.1: HttpFileCollectionValueProvider上传文件的绑定

HTML:

 @using (Html.BeginForm("TestFormValueProvider", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <input type="text" name="testBox" value="" />
        <input type="submit" value="提交" title="提交" />
        <input type="file" name="file1"/>
        <input type="file" name="file2"/>
        <input type="file" name="file3"/>
        <input type="file" name="file1"/>
    }

HTML代码

Controller中获取从Html中上传的文件

     HttpFileCollectionValueProvider files = new HttpFileCollectionValueProvider(ControllerContext);

            object test = files.GetValue("file1").ConvertTo(typeof(HttpPostedFileWrapper[]));
            var tes = test as HttpPostedFileWrapper[];

            foreach (var t in tes)
            {
                t.SaveAs(Server.MapPath("../Content") + "/"+t.FileName);
            }

因为文件上传控件中有两个Name是file1的。所以得到的是两个文件

  

2.2: RouteDataValueProvider传递RouteData中的Values属性到View

        public ActionResult Index()
        {
            // Pass data in RouteDataDictionary
            RouteDataValueProvider provider = new RouteDataValueProvider(ControllerContext);

            return View(provider);
        }

Controller

View中接收来自Controller的 Model

@Model RouteDataValueProvider
<h2>Index</h2>
<h3>@Model.GetValue("controller").ConvertTo(typeof(string))</h3>
<h3>@Model.GetValue("action").ConvertTo(typeof(string))</h3>

View

2.3: ChildActionValueProvider传递RouteData中的Value到子Action中的View

MVC中有很多HTMLHelper的扩展方法用于生成当前View的子View

 // Summary:
    //     Represents support for calling child action methods and rendering the result
    //     inline in a parent view.
    public static class ChildActionExtensions
    {
        // Summary:
        //     Invokes the specified child action method and returns the result as an HTML
        //     string.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the action method to invoke.
        //
        // Returns:
        //     The child action result as an HTML string.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName);
        //
        // Summary:
        //     Invokes the specified child action method with the specified parameters and
        //     returns the result as an HTML string.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the action method to invoke.
        //
        //   routeValues:
        //     An object that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Returns:
        //     The child action result as an HTML string.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, object routeValues);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and returns the result as an HTML string.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the action method to invoke.
        //
        //   routeValues:
        //     A dictionary that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Returns:
        //     The child action result as an HTML string.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, RouteValueDictionary routeValues);
        //
        // Summary:
        //     Invokes the specified child action method using the specified controller
        //     name and returns the result as an HTML string.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the action method to invoke.
        //
        //   controllerName:
        //     The name of the controller that contains the action method.
        //
        // Returns:
        //     The child action result as an HTML string.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and controller name and returns the result as an HTML string.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the action method to invoke.
        //
        //   controllerName:
        //     The name of the controller that contains the action method.
        //
        //   routeValues:
        //     An object that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Returns:
        //     The child action result as an HTML string.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and controller name and returns the result as an HTML string.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the action method to invoke.
        //
        //   controllerName:
        //     The name of the controller that contains the action method.
        //
        //   routeValues:
        //     A dictionary that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Returns:
        //     The child action result as an HTML string.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static MvcHtmlString Action(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues);
        //
        // Summary:
        //     Invokes the specified child action method and renders the result inline in
        //     the parent view.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the child action method to invoke.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static void RenderAction(this HtmlHelper htmlHelper, string actionName);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and renders the result inline in the parent view.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the child action method to invoke.
        //
        //   routeValues:
        //     An object that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static void RenderAction(this HtmlHelper htmlHelper, string actionName, object routeValues);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and renders the result inline in the parent view.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the child action method to invoke.
        //
        //   routeValues:
        //     A dictionary that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static void RenderAction(this HtmlHelper htmlHelper, string actionName, RouteValueDictionary routeValues);
        //
        // Summary:
        //     Invokes the specified child action method using the specified controller
        //     name and renders the result inline in the parent view.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the child action method to invoke.
        //
        //   controllerName:
        //     The name of the controller that contains the action method.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static void RenderAction(this HtmlHelper htmlHelper, string actionName, string controllerName);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and controller name and renders the result inline in the parent view.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the child action method to invoke.
        //
        //   controllerName:
        //     The name of the controller that contains the action method.
        //
        //   routeValues:
        //     An object that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static void RenderAction(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues);
        //
        // Summary:
        //     Invokes the specified child action method using the specified parameters
        //     and controller name and renders the result inline in the parent view.
        //
        // Parameters:
        //   htmlHelper:
        //     The HTML helper instance that this method extends.
        //
        //   actionName:
        //     The name of the child action method to invoke.
        //
        //   controllerName:
        //     The name of the controller that contains the action method.
        //
        //   routeValues:
        //     A dictionary that contains the parameters for a route. You can use routeValues
        //     to provide the parameters that are bound to the action method parameters.
        //     The routeValues parameter is merged with the original route values and overrides
        //     them.
        //
        // Exceptions:
        //   System.ArgumentNullException:
        //     The htmlHelper parameter is null.
        //
        //   System.ArgumentException:
        //     The actionName parameter is null or empty.
        //
        //   System.InvalidOperationException:
        //     The required virtual path data cannot be found.
        public static void RenderAction(this HtmlHelper htmlHelper, string actionName, string controllerName, RouteValueDictionary routeValues);
    }

MVC Library Code

首先定义一个View在它里面包含一个子的View(通过以上的扩展方法)

<div>
    @Html.Action("ChildActionMethod","Test", new {Name="John", Age="32"});
</div>

接着在他所指向的Controller中我们接收这个扩展方法的ChildActionValueProvider

  public ActionResult ChildActionMethod() {
            ChildActionValueProvider child = new ChildActionValueProvider(ControllerContext);

            return View(child);
        }

改Action方法指向的View就是子View中的内容

<h3>@Model.GetValue("Name").ConvertTo(typeof(string))</h3>

<h3>@Model.GetValue("Age").ConvertTo(typeof(string))</h3>

呈现的效果类似于:

时间: 2024-10-16 00:20:32

MVC 学习随笔(一)的相关文章

ASP.NET MVC学习之控制器篇

一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MVC学习之路由篇幅(2) ASP.NET MVC学习之路由篇幅(3) 二.正文 1.IController的使用 这个接口可能很多人都没有使用过,但是我们常用的Controller类实现了这个接口,而且只要实现这个接口就可以作为一个控制器,当然很多的内部的处理就要我们自己去做了. 下面我利用ICont

ASP.NET MVC学习之视图篇(1)

一.前言 不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔.当然笔者后面的随笔如果没有特殊说明使用的都是ASP.NET MVC 4,因为笔者认为只要精通即可. 二.正文 1.自定义视图引擎 相信很多人都知道在控制器中一个动作方法返回一个View之后,ASP.NET MVC默认会到Views下对应的控制器名的文件夹下寻找和这个动作方法同名的视图(如果你指定了视图名则会按照你指定的视图

ASP.NET MVC学习之过滤器篇(1)

一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC 4之上(VS2012) 1.授权过滤器 只要涉及用户的网站,都一定会涉及到什么权限的用户可以访问哪个页面.对于新手而言可能都在每个页面中单独写这个功能方法,导致的后果就是大量重复的代码,并且不便于以后的变动.有用一定经验之后,就会采用集中控制的方式,让所有的页面先执行特定的方法去判断,这样的优点就

(转)ASP.NET MVC 学习第一天

天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择aspx那我们就没必要用mvc喽 在这里我们简单说一下,项目模板如果选择空,这就需要我们自己进行导入很多文件,而选择基本vs会

ASP.NET MVC学习之过滤器(一)

一.前言 继前面四篇ASP.NET MVC的随笔,我们继续向下学习.上一节我们学习了关于控制器的使用,本节我们将要学习如何使用过滤器控制用户访问页面. 二.正文 以下的示例建立在ASP.NET MVC 4之上(VS2012) 1.授权过滤器 只要涉及用户的网站,都一定会涉及到什么权限的用户可以访问哪个页面.对于新手而言可能都在每个页面中单独写这个功能方法,导致的后果就是大量重复的代码,并且不便于以后的变动.有用一定经验之后,就会采用集中控制的方式,让所有的页面先执行特定的方法去判断,这样的优点就

ASP.NET MVC学习之模型验证篇

一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们.慢慢的已经在博客园中度过一年半了,伊始只是将博客园作为自己学习的记录本一样使用,也不敢将自己的随笔发表到博客园首页,生怕自己的技艺不高,反倒成了笑话.但是随着时间的推移,再也按捺不住这种想法,于是就写了一篇随笔发表到博客园首页.让我意想不到的是有许多人都看了,而且也留下了评论.这让我鼓起勇气写了第二.三.四篇.到现在的连载,这里我希望那些从未发表过随笔的人可以尝试去发表,在这里他人不会嘲讽你,而是会给你更好的建议.说了这么多下面我们继

servlet技术学习随笔

进入这里学习的第二天!开始着手想看servlet,前面看到javabean jsp 跟这个servlet的MVC框架!真心觉得很重要,技术这种东西学会了就很懂!学不会再怎么解释都不明白.看了一整上午!没怎么搞明白!才想起来以前学习c#的土办法!各种去百度!起查……终于算是有点懂得了! (1).  PrintWriter out = response.getWriter();当一个Servlet响应的时候将响应信息通过out对象输出到网页上,当响应结束时它自动被关闭.PrintWriter用处是将

ASP.NET MVC学习之控制器篇扩展性

原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名问题,虽然方法的名称和参数一样,但是里面的逻辑是不一样的,因为你设置了对应的注解属性可以确定调用哪个动作方法.这个时候你就需要将动作的名称与方法的名称区别开来,那么你就可以使用ActionName注解属性.比如我们要求一个页面在本地访问与非本地访问时呈现不同的页面,但是你又想用不同的方法区分开来写,

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>