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