zoukankan      html  css  js  c++  java
  • 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>

    呈现的效果类似于:

     使用ValueProviderCollection传递Model。

    Controller端代码

     NameValueCollection nCollection = new NameValueCollection() { };
                nCollection.Add("Name", "John");
                nCollection.Add("Age", "32");
                NameValueCollectionValueProvider provider1 = new NameValueCollectionValueProvider(nCollection,CultureInfo.CurrentCulture);
    
                Dictionary<string, string> routeData = new Dictionary<string, string>();
                routeData.Add("Controller", "MyController");
                routeData.Add("Action", "MyController");
    
    
                DictionaryValueProvider<string> provider2 = new DictionaryValueProvider<string>(routeData, CultureInfo.CurrentCulture);
                List<IValueProvider> providers = new List<IValueProvider>();
                providers.Add(provider1);
                providers.Add(provider2);
    
    
                ValueProviderCollection collection = new ValueProviderCollection(new List<IValueProvider>(providers));
                return View(collection);

    View中可以使用Model.GetValue("...").ConvertTo(..)的方式获取ProviderCollection中传递过来的值。虽然该Collection中包含各种Provider的类型。但是ProviderCollection提供了类似于ValueProvider的GetValues方法。 他会从当前的所有Provider中找到第一个匹配的值。

    反之从View中往Controller中的传值也是一样的。

  • 相关阅读:
    Tomcat5配置mysql
    Eclipse完全手册
    MBR是什么
    必杀技公布——用特征码定位关键代码,秒杀MFC程序
    Google C++编程命名约定
    认识硬盘主引导扇区
    c++ const 用法详解
    主引导区
    C++ 关于struce结构体字节对齐
    Fedora 显示设备配置工具介绍
  • 原文地址:https://www.cnblogs.com/ygshen/p/4120732.html
Copyright © 2011-2022 走看看