返璞归真 asp.net mvc (4) – View/ViewEngine

[索引页]
[源码下载]

返璞归真 asp.net mvc (4) – View/ViewEngine

作者:webabcd

介绍
asp.net mvc 之 View 和 ViewEngine

  • ViewData 和 TempData 都得以向 View 传递数据,其中 TempData 是保存在
    Session 中的,几遍呼吁后此 Session 会被破除
  • HtmlHelper – 在 View 中显示 HTML 元素的一个匡助类
  • IViewEngine – 自定义的视图引擎需要贯彻此接口
  • VirtualPathProviderViewEngine – 实现了 IViewEngine
    接口的抽象类,实现了遵照指定的门道格式搜索对应的页面文件的效用(内用缓存机制)
  • IView – 唯有一个索要贯彻的不二法门,就是展现 HTML 结果

示例
1、演示 View 的 Demo
ViewDemoController.cs

Ajax 1using System;
Ajax 2using System.Collections.Generic;
Ajax 3using System.Linq;
Ajax 4using System.Web;
Ajax 5using System.Web.Mvc;
Ajax 6using System.Web.Mvc.Ajax;
Ajax 7
Ajax 8using MVC.Models;
Ajax 9
Ajax 10namespace MVC.Controllers
Ajax 11Ajax 12Ajax 13{
Ajax 14    public class ViewDemoController : Controller
Ajax 15Ajax 16    Ajax 17{
Ajax 18        ProductSystem ps = new ProductSystem();
Ajax 19
Ajax 20        public ActionResult Details(int id)
Ajax 21Ajax 22        Ajax 23{
Ajax 24            var product = ps.GetProduct(id);
Ajax 25
Ajax 26            if (product == null)
Ajax 27Ajax 28            Ajax 29{
Ajax 30                return View(“NotFound”);
Ajax 31            }
Ajax 32            else
Ajax 33Ajax 34            Ajax 35{
Ajax 36                product.CategoriesReference.Load();
Ajax 37
Ajax 38                // 编辑 Product 的时候需要在一个 DropDownList 中挑选其所对应的 Category, 所以这里要结构一个 SelectList 类型的 ViewData
Ajax 39                if (product.Categories == null)
Ajax 40                    ViewData[“CategoryList”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”);
Ajax 41                else
Ajax 42                    ViewData[“CategoryList”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”, product.Categories.CategoryID);
Ajax 43
Ajax 44                // ViewData 和 TempData 都可以向 View 传递数据,其中 TempData 是保存在 Session 中的,两回呼吁后此 Session 会被破除
Ajax 45                // 在 View 中采纳的时候,ViewData[key] 或 TempData[key] 即可
Ajax 46                TempData[“Temp”] = “TempData”;
Ajax 47
Ajax 48                return View(“Details”, product);
Ajax 49            }
Ajax 50        }
Ajax 51
Ajax 52        [AcceptVerbs(HttpVerbs.Post)]
Ajax 53        public ActionResult Update(int id, FormCollection formValues)
Ajax 54Ajax 55        Ajax 56{
Ajax 57            var product = ps.GetProduct(id);
Ajax 58
Ajax 59            // 可以透过 UpdateModel, 让系统活动为属性赋值(通过反射的主意,取得对象的属性名称,然后和 Request 的 key 做配合,匹配成功的则赋值)
Ajax 60            UpdateModel<Products>(product);
Ajax 61
Ajax 62            // 通过以下的艺术让 UpdateModel 只更新指定属性
Ajax 63            // string[] allowedProperties = new[] { “ProductName”, “UnitPrice” };
Ajax 64            // UpdateModel(product, allowedProperties);
Ajax 65
Ajax 66            var category = new CategeorySystem().GetCategory(int.Parse(Request.Form[“Category”]));
Ajax 67            product.CategoriesReference.EntityKey = ps.CreateEntityKey(“Categories”, category);
Ajax 68
Ajax 69            if (!product.IsValid)
Ajax 70Ajax 71            Ajax 72{
Ajax 73                foreach (var validation in product.GetValidation())
Ajax 74Ajax 75                Ajax 76{
Ajax 77                    // 设置验证信息
Ajax 78                    ModelState.AddModelError(validation.PropertyName, validation.ErrorMessage);
Ajax 79                }
Ajax 80            }
Ajax 81            else
Ajax 82Ajax 83            Ajax 84{
Ajax 85                ps.Save();
Ajax 86            }
Ajax 87
Ajax 88            ViewData[“CategoryList”] = new SelectList(new CategeorySystem().GetCategory(), “CategoryId”, “CategoryName”, category.CategoryID);
Ajax 89
Ajax 90            return View(“Details”, product);
Ajax 91        }
Ajax 92    }
Ajax 93}

Details.aspx

Ajax 94Ajax 95<%Ajax 96@ Page Title=”” Language=”C#” MasterPageFile=”~/Views/Shared/Site.Master” Inherits=”System.Web.Mvc.ViewPage<MVC.Models.Products>” %>
Ajax 97
Ajax 98<asp:Content ID=”Content1″ ContentPlaceHolderID=”TitleContent” runat=”server”>
Ajax 99    Details
Ajax 100</asp:Content>
Ajax 101<asp:Content ID=”Content2″ ContentPlaceHolderID=”MainContent” runat=”server”>
Ajax 102Ajax 103    <style type=”text/css”>Ajax 104
Ajax 105        .bold
Ajax 106Ajax 107        {Ajax 108}{
Ajax 109            font-weight: bold;
Ajax 110        }
Ajax 111    </style>
Ajax 112    <h2>
Ajax 113        Details</h2>
Ajax 114    <%= Html.ValidationSummary(“输入信息有误”) %>
Ajax 115Ajax 116    <%Ajax 117 Html.BeginForm(“Update”, “ViewDemo”, new { id = Model.ProductID }, FormMethod.Post); %>
Ajax 118    <p>
Ajax 119        <strong>ProductID:</strong>
Ajax 120        <%= Html.Encode(Model.ProductID) %>
Ajax 121    </p>
Ajax 122    <p>
Ajax 123        <label for=”ProductName”>
Ajax 124            ProductName:</label>
Ajax 125        <%= Html.TextBox(“ProductName”, Model.ProductName, new { style = “color: blue;”, @class = “bold” })%>
Ajax 126        <%= Html.ValidationMessage(“ProductName”, “*”) %>
Ajax 127    </p>
Ajax 128    <p>
Ajax 129        <label for=”Category”>
Ajax 130            Category:</label>
Ajax 131Ajax 132        <%Ajax 133— Html.ListBox() 和 Html.DropDownList() 需要 IEnumerable<SelectListItem> 类型的多寡做多少源 –%>
Ajax 134        <%= Html.DropDownList(“Category”, ViewData[“CategoryList”] as SelectList)%>
Ajax 135    </p>
Ajax 136    <p>
Ajax 137        <strong>UnitPrice:</strong>
Ajax 138        <%= Html.Encode(string.Format(“{0:F2}”, Model.UnitPrice))%>
Ajax 139    </p>
Ajax 140    <p>
Ajax 141        <input type=”submit” value=”Save” />
Ajax 142    </p>
Ajax 143    <p>
Ajax 144        <%= TempData[“Temp”]%>
Ajax 145    </p>
Ajax 146Ajax 147    <%Ajax 148 Html.EndForm(); %>
Ajax 149    <p>
Ajax 150        <%=Html.RouteLink(“重临首页”, new { Controller = “Home” })%>
Ajax 151    </p>
Ajax 152
Ajax 153    
Ajax 154Ajax 155<%Ajax 156— 需要采纳 Web Form 格局的话,则在后置代码中连续 System.Web.Mvc.ViewPage 或 System.Web.Mvc.ViewPage<T> 即可– %>
Ajax 157    
Ajax 158    
Ajax 159Ajax 160<%Ajax 161— 
Ajax 162HtmlHelper 简要表达:
Ajax 163
Ajax 164
Ajax 165可以用如下的主意生成 form
Ajax 166using (Html.BeginForm()) { }
Ajax 167using (Html.BeginRouteForm()) { }
Ajax 168Html.BeginForm(); Html.EndForm();
Ajax 169
Ajax 170
Ajax 171可以拔取 Html.ListBox(), Html.RadioButton() 之类的来生成 html 元素
Ajax 172
Ajax 173
Ajax 174Html.ValidationMessage() – 指定的 ModelName 输入音讯不合法时所出口的印证音信
Ajax 175Ajax,Html.ValidationSummary() – 汇总所有验证音讯
Ajax 176证实消息方可在 Action 中用 ModelState.AddModelError() 的点子来添加
Ajax 177证实信息的样式经过样式表修改 .field-validation-error{} .input-validation-error {} .validation-summary-errors {}
Ajax 178
Ajax 179
Ajax 180Html.Encode(); Html.AttributeEncode(); 用于对出口的情节做编码
Ajax 181
Ajax 182
Ajax 183Html.RenderPartial() – 引入一个 Partial View
Ajax 184
Ajax 185
Ajax 186Html.ActionLink() – 根据 Action 找目标
Ajax 187Html.RouteLink() – 依照路由找目的
Ajax 188
Ajax 189
Ajax 190Html.ViewContext – View 的上下文消息。包括 Controller, TempData, ViewData, 路由音信, HttpContext 等信息
Ajax 191–%>
Ajax 192</asp:Content>
Ajax 193

2、制造一个自定义的 ViewEngine 的 Demo
MyView.cs

Ajax 194using System;
Ajax 195using System.Collections.Generic;
Ajax 196using System.Linq;
Ajax 197using System.Web;
Ajax 198
Ajax 199using System.Web.Mvc;
Ajax 200using System.IO;
Ajax 201using System.Text.RegularExpressions;
Ajax 202
Ajax 203namespace MVC
Ajax 204Ajax 205Ajax 206{
Ajax 207Ajax 208    /**//// <summary>
Ajax 209    /// 自定义的视图
Ajax 210    /// 视图需要继续 IView 接口
Ajax 211    /// </summary>
Ajax 212    public class MyView : IView
Ajax 213Ajax 214    Ajax 215{
Ajax 216        // 视图文件的大体路径
Ajax 217        private string _viewPhysicalPath;
Ajax 218
Ajax 219        public MyView(string viewPhysicalPath)
Ajax 220Ajax 221        Ajax 222{
Ajax 223            _viewPhysicalPath = viewPhysicalPath;
Ajax 224        }
Ajax 225
Ajax 226Ajax 227        /**//// <summary>
Ajax 228        /// 实现 IView 接口的 Render() 方法
Ajax 229        /// </summary>
Ajax 230        public void Render(ViewContext viewContext, TextWriter writer)
Ajax 231Ajax 232        Ajax 233{
Ajax 234            // 获取视图文件的原有内容  
Ajax 235            string rawContents = File.ReadAllText(_viewPhysicalPath);
Ajax 236
Ajax 237            // 依据自定义的规则解析原始内容  
Ajax 238            string parsedContents = Parse(rawContents, viewContext.ViewData);
Ajax 239
Ajax 240            // 展现出解析后的内容
Ajax 241            writer.Write(parsedContents);
Ajax 242        }
Ajax 243
Ajax 244
Ajax 245        public string Parse(string contents, ViewDataDictionary viewData)
Ajax 246Ajax 247        Ajax 248{
Ajax 249            // 对 {##} 之间的情节作分析
Ajax 250            return Regex.Replace
Ajax 251            (
Ajax 252                contents, 
Ajax 253                @”\{#(.+)#\}”, 
Ajax 254
Ajax 255                // 委托项目 public delegate string Match伊娃(Eva)luator(Match match)
Ajax 256                p => GetMatch(p, viewData)
Ajax 257            );
Ajax 258        }
Ajax 259
Ajax 260        protected virtual string GetMatch(Match m, ViewDataDictionary viewData)
Ajax 261Ajax 262        Ajax 263{
Ajax 264            if (m.Success)
Ajax 265Ajax 266            Ajax 267{
Ajax 268                // 获取匹配后的结果,即 ViewData 中的 key 值,并基于这一个 key 值再次来到 ViewData 中对应的 value
Ajax 269                string key = m.Result(“$1”);
Ajax 270                if (viewData.ContainsKey(key))
Ajax 271Ajax 272                Ajax 273{
Ajax 274                    return viewData[key].ToString();
Ajax 275                }
Ajax 276            }
Ajax 277
Ajax 278            return string.Empty;
Ajax 279        }
Ajax 280    }
Ajax 281}
Ajax 282

MyViewEngine.cs

Ajax 283using System;
Ajax 284using System.Collections.Generic;
Ajax 285using System.Linq;
Ajax 286using System.Web;
Ajax 287
Ajax 288using System.Web.Mvc;
Ajax 289
Ajax 290namespace MVC
Ajax 291Ajax 292Ajax 293{
Ajax 294    // MvcContrib 中提供了过多 ViewEngine, 还提供了以 asp.net mvc 框架为底蕴的一部分附加的法力
Ajax 295    // 地址:http://www.codeplex.com/MVCContrib
Ajax 296
Ajax 297Ajax 298    /**//// <summary>
Ajax 299    /// 自定义的视图引擎
Ajax 300    /// 视图引擎需要连续 IViewEngine 接口
Ajax 301    /// VirtualPathProviderViewEngine 继承了 IViewEngine 接口,实现了遵照指定的门道格式搜索对应的页面文件的功用(内用缓存机制)
Ajax 302    /// </summary>
Ajax 303    public class MyViewEngine : VirtualPathProviderViewEngine
Ajax 304Ajax 305    Ajax 306{
Ajax 307        public MyViewEngine()
Ajax 308Ajax 309        Ajax 310{
Ajax 311            // 自定义 View 路径格式
Ajax 312            base.ViewLocationFormats = new string[] 
Ajax 313Ajax 314            Ajax 315
Ajax 316                “~/Views/{1}/{0}.my”, “~/Views/Shared/{0}.my” 
Ajax 317            };
Ajax 318        }
Ajax 319
Ajax 320        protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
Ajax 321Ajax 322        Ajax 323{
Ajax 324            return this.CreateView(controllerContext, partialPath, string.Empty);
Ajax 325        }
Ajax 326
Ajax 327Ajax 328        /**//// <summary>
Ajax 329        /// 依据指定路线再次回到一个贯彻了 IView 接口的目标
Ajax 330        /// </summary>
Ajax 331        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
Ajax 332Ajax 333        Ajax 334{
Ajax 335            var physicalPath = controllerContext.HttpContext.Server.MapPath(viewPath);
Ajax 336
Ajax 337            return new MyView(physicalPath);
Ajax 338        }
Ajax 339    }
Ajax 340}
Ajax 341

Global.asax.cs

Ajax 342protected void Application_Start()
Ajax 343Ajax 344Ajax 345{
Ajax 346    // 增加新的视图引擎 ViewEngine
Ajax 347    ViewEngines.Engines.Add(new MyViewEngine());  
Ajax 348}

CustomViewEngineController.cs

Ajax 349using System;
Ajax 350using System.Collections.Generic;
Ajax 351using System.Linq;
Ajax 352using System.Web;
Ajax 353using System.Web.Mvc;
Ajax 354using System.Web.Mvc.Ajax;
Ajax 355
Ajax 356namespace MVC.Controllers
Ajax 357Ajax 358Ajax 359{
Ajax 360Ajax 361    /**//// <summary>
Ajax 362    /// 用于演示自定义的 ViewEngine 的 Controller
Ajax 363    /// </summary>
Ajax 364    public class CustomViewEngineController : Controller
Ajax 365Ajax 366    Ajax 367{
Ajax 368        public ActionResult Index()
Ajax 369Ajax 370        Ajax 371{
Ajax 372            ViewData[“name”] = “webabcd”;
Ajax 373            ViewData[“age”] = “70”;
Ajax 374
Ajax 375            // 假诺视图文件中有 {##} 格局的字符串,则 MyViewEngine 会对其做相应的剖析
Ajax 376            // 如 {#name#} 会被分析为 webabcd
Ajax 377
Ajax 378            return View();
Ajax 379        }  
Ajax 380    }
Ajax 381}
Ajax 382

Index.my(智能感知在“工具 – 选项 – 文本编辑器 – 文件扩大名”中编辑)

Ajax 383<html>
Ajax 384<head>
Ajax 385    <title>成立自定义的 ViewEngine 的 Demo</title>
Ajax 386</head>
Ajax 387<body>
Ajax 388    <div>name: {#name#}</div>
Ajax 389    <div>age: {#age#}</div>
Ajax 390</body>
Ajax 391</html>
Ajax 392

运作结果:
name: webabcd
age: 70

OK
[源码下载]

相关文章