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

ASP.NET MVC底层原理与HTTP契约解析 MVC模式本质是HTTP请求与.NET对象之间的结构化映射协议,其核心在于路由匹配、模型绑定、视图解析三大机制如何严格对齐HTTP语义。理解RouteData如何将URL路径段确定性地分解为Controller/Action/参数,掌握DefaultModelBinder在ValueProvider链中按优先级提取表单、路由、查询参数的执行逻辑,才能真正驾驭高并发、安全合规、可测试的Web应用构建。这些原理在ASP.NET Framework与Core中数学同构,仅实现载体不同。本文聚焦MVC内核中被现代抽 阅读详情
[索引页]
[源码下载]


返璞归真asp.net mvc 1.0(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
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.Mvc;
using  System.Web.Mvc.Ajax;

using  MVC.Models;

namespace  MVC.Controllers
{
    
public class ViewDemoController : Controller
    
{
        ProductSystem ps 
= new ProductSystem();

        
public ActionResult Details(int id)
        
{
            var product 
= ps.GetProduct(id);

            
if (product == null)
            
{
                
return View("NotFound");
            }

            
else
            
{
                product.CategoriesReference.Load();

                
// 编辑 Product 的时候需要在一个 DropDownList 中选择其所对应的 Category, 所以这里要构造一个 SelectList 类型的 ViewData
                if (product.Categories == null)
                    ViewData[
"CategoryList"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId", "CategoryName");
                
else
                    ViewData[
"CategoryList"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId", "CategoryName", product.Categories.CategoryID);

                
// ViewData 和 TempData 都可以向 View 传递数据,其中 TempData 是保存在 Session 中的,一次请求后此 Session 会被清除
                
// 在 View 中使用的时候,ViewData[key] 或 TempData[key] 即可
                TempData["Temp"] = "TempData";

                
return View("Details", product);
            }

        }


        [AcceptVerbs(HttpVerbs.Post)]
        
public ActionResult Update(int id, FormCollection formValues)
        
{
            var product 
= ps.GetProduct(id);

            
// 可以通过 UpdateModel, 让系统自动为属性赋值(通过反射的方式,取得对象的属性名称,然后和 Request 的 key 做匹配,匹配成功的则赋值)
            UpdateModel<Products>(product);

            
// 通过以下的方式让 UpdateModel 只更新指定属性
            
// string[] allowedProperties = new[] { "ProductName", "UnitPrice" };
            
// UpdateModel(product, allowedProperties);

            var category 
= new CategeorySystem().GetCategory(int.Parse(Request.Form["Category"]));
            product.CategoriesReference.EntityKey 
= ps.CreateEntityKey("Categories", category);

            
if (!product.IsValid)
            
{
                
foreach (var validation in product.GetValidation())
                
{
                    
// 设置验证信息
                    ModelState.AddModelError(validation.PropertyName, validation.ErrorMessage);
                }

            }

            
else
            
{
                ps.Save();
            }


            ViewData[
"CategoryList"] = new SelectList(new CategeorySystem().GetCategory(), "CategoryId", "CategoryName", category.CategoryID);

            
return View("Details", product);
        }

    }

}

Details.aspx
<% @ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MVC.Models.Products>"  %>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="TitleContent"  runat ="server" >
    Details
</ asp:Content >
< asp:Content  ID ="Content2"  ContentPlaceHolderID ="MainContent"  runat ="server" >
    
< style  type ="text/css" >
        .bold
        
{
            font-weight
: bold;
        
}

    
</ style >
    
< h2 >
        Details
</ h2 >
    
<% =  Html.ValidationSummary( " 输入信息有误 " )  %>
    
<%  Html.BeginForm("Update", "ViewDemo", new { id = Model.ProductID }, FormMethod.Post);  %>
    
< p >
        
< strong > ProductID: </ strong >
        
<% =  Html.Encode(Model.ProductID)  %>
    
</ p >
    
< p >
        
< label  for ="ProductName" >
            ProductName:
</ label >
        
<% =  Html.TextBox( " ProductName " , Model.ProductName,  new  { style  =   " color: blue; " , @class  =   " bold "  }) %>
        
<% =  Html.ValidationMessage( " ProductName " ,  " * " )  %>
    
</ p >
    
< p >
        
< label  for ="Category" >
            Category:
</ label >
        
<% -- Html.ListBox() 和 Html.DropDownList() 需要 IEnumerable<SelectListItem> 类型的数据做数据源 -- %>
        
<% =  Html.DropDownList( " Category " , ViewData[ " CategoryList " ]  as  SelectList) %>
    
</ p >
    
< p >
        
< strong > UnitPrice: </ strong >
        
<% =  Html.Encode( string .Format( " {0:F2} " , Model.UnitPrice)) %>
    
</ p >
    
< p >
        
< input  type ="submit"  value ="Save"   />
    
</ p >
    
< p >
        
<% =  TempData[ " Temp " ] %>
    
</ p >
    
<%  Html.EndForm();  %>
    
< p >
        
<% = Html.RouteLink( " 返回首页 " ,  new  { Controller  =   " Home "  }) %>
    
</ p >

    
<% -- 需要使用 Web Form 方式的话,则在后置代码中继承 System.Web.Mvc.ViewPage 或 System.Web.Mvc.ViewPage<T> 即可--  %>
    
    
<% -- 
HtmlHelper 简要说明:


可以用如下的方式生成 form
using (Html.BeginForm()) { }
using (Html.BeginRouteForm()) { }
Html.BeginForm(); Html.EndForm();


可以使用 Html.ListBox(), Html.RadioButton() 之类的来生成 html 元素


Html.ValidationMessage() 
- 指定的 ModelName 输入信息不合法时所输出的验证信息
Html.ValidationSummary() 
- 汇总所有验证信息
验证信息可以在 Action 中用 ModelState.AddModelError() 的方式来添加
验证信息的样式通过样式表修改 .field
-validation-error{} .input-validation-error {} .validation-summary-errors {}


Html.Encode(); Html.AttributeEncode(); 用于对输出的内容做编码


Html.RenderPartial() 
- 引入一个 Partial View


Html.ActionLink() 
- 根据 Action 找目标
Html.RouteLink() 
- 根据路由找目标


Html.ViewContext 
- View 的上下文信息。包括 Controller, TempData, ViewData, 路由信息, HttpContext 等信息
--
%>
</ asp:Content >


2、创建一个自定义的 ViewEngine 的 Demo
MyView.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;

using  System.Web.Mvc;
using  System.IO;
using  System.Text.RegularExpressions;

namespace  MVC
{
    
/// <summary>
    
/// 自定义的视图
    
/// 视图需要继承 IView 接口
    
/// </summary>

    public class MyView : IView
    
{
        
// 视图文件的物理路径
        private string _viewPhysicalPath;

        
public MyView(string viewPhysicalPath)
        
{
            _viewPhysicalPath 
= viewPhysicalPath;
        }


        
/// <summary>
        
/// 实现 IView 接口的 Render() 方法
        
/// </summary>

        public void Render(ViewContext viewContext, TextWriter writer)
        
{
            
// 获取视图文件的原始内容  
            string rawContents = File.ReadAllText(_viewPhysicalPath);

            
// 根据自定义的规则解析原始内容  
            string parsedContents = Parse(rawContents, viewContext.ViewData);

            
// 呈现出解析后的内容
            writer.Write(parsedContents);
        }



        
public string Parse(string contents, ViewDataDictionary viewData)
        
{
            
// 对 {##} 之间的内容作解析
            return Regex.Replace
            (
                contents, 
                
@"/{#(.+)#/}", 

                
// 委托类型 public delegate string MatchEvaluator(Match match)
                p => GetMatch(p, viewData)
            );
        }


        
protected virtual string GetMatch(Match m, ViewDataDictionary viewData)
        
{
            
if (m.Success)
            
{
                
// 获取匹配后的结果,即 ViewData 中的 key 值,并根据这个 key 值返回 ViewData 中对应的 value
                string key = m.Result("$1");
                
if (viewData.ContainsKey(key))
                
{
                    
return viewData[key].ToString();
                }

            }


            
return string.Empty;
        }

    }

}


MyViewEngine.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;

using  System.Web.Mvc;

namespace  MVC
{
    
// MvcContrib 中提供了很多 ViewEngine, 还提供了以 asp.net mvc 框架为基础的一些额外的功能
    
// 地址:http://www.codeplex.com/MVCContrib

    
/// <summary>
    
/// 自定义的视图引擎
    
/// 视图引擎需要继承 IViewEngine 接口
    
/// VirtualPathProviderViewEngine 继承了 IViewEngine 接口,实现了根据指定的路径格式搜索对应的页面文件的功能(内用缓存机制)
    
/// </summary>

    public class MyViewEngine : VirtualPathProviderViewEngine
    
{
        
public MyViewEngine()
        
{
            
// 自定义 View 路径格式
            base.ViewLocationFormats = new string[] 
            
{ 
                
"~/Views/{1}/{0}.my", "~/Views/Shared/{0}.my" 
            }
;
        }


        
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
        
{
            
return this.CreateView(controllerContext, partialPath, string.Empty);
        }


        
/// <summary>
        
/// 根据指定路径返回一个实现了 IView 接口的对象
        
/// </summary>

        protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
        
{
            var physicalPath 
= controllerContext.HttpContext.Server.MapPath(viewPath);

            
return new MyView(physicalPath);
        }

    }

}


Global.asax.cs
protected   void  Application_Start()
{
    
// 增加新的视图引擎 ViewEngine
    ViewEngines.Engines.Add(new MyViewEngine());  
}

CustomViewEngineController.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Web.Mvc;
using  System.Web.Mvc.Ajax;

namespace  MVC.Controllers
{
    
/// <summary>
    
/// 用于演示自定义的 ViewEngine 的 Controller
    
/// </summary>

    public class CustomViewEngineController : Controller
    
{
        
public ActionResult Index()
        
{
            ViewData[
"name"] = "webabcd";
            ViewData[
"age"] = "70";

            
// 如果视图文件中有 {##} 形式的字符串,则 MyViewEngine 会对其做相应的解析
            
// 如 {#name#} 会被解析为 webabcd

            
return View();
        }
  
    }

}


Index.my(智能感知在“工具 - 选项 - 文本编辑器 - 文件扩展名”中编辑)
< html >
< head >
    
< title > 创建自定义的 ViewEngine 的 Demo </ title >
</ head >
< body >
    
< div > name: {#name#} </ div >
    
< div > age: {#age#} </ div >
</ body >
</ html >

运行结果:
name: webabcd
age: 70


OK
[源码下载]
HDL_Coder_Support_Package_for_Xilinx_Zynq-7000_Platform_2016b.zip Matlab R2016b 的Zynq平台支持包,可以离线安装。安装方法请参考附带readme.txt文件。 立即下载

相关推荐

matlab开发-HdlverifierSupportPackageforxilinxfpgabboads

matlab开发-HdlverifierSupportPackageforxilinxfpgabboads。在xilinx fpgas和zynq socs上调试和测试HDL代码。

ZYNQ7020联合matlab2021a simulink自动生成代码

上一步我们在下载第三方附件的时候发现会报下载错误,我们就在这里解决。把准备好的离线硬件支持包《ZYNQ7000配套Matlab2021工具》->《simulink_zynq_combine_tool》->《R2021a》->《archives》中的四个文件夹复制到上一步路径中对应的《archives》文件中,替换即可。《ZYNQ7000配套Matlab2021工具》->《simulink_zynq_combine_tool》->《R2021a》中有一个readme文件,是按照方法的简要说明,可以阅读一下。

weixin_43695159的博客 4808

ASP.NET MVC框架开发系列课程(15):ViewEngine解析

ASP.NET MVC框架开发系列课程(15):ViewEngine解析

Xilinx zynq zc702学习总结

Xilinx zynq zc702开发: 一、zynq开发整个生态系统搭建: 1.基础资料获取: https://github.com/Xilinx/ (包括:交叉编译工具,linux kernel源码,u-boot源码, device-tree源码, qemu, gdb等等) http://www.wiki.xilinx.com/ (提供 了几乎所有的学习资料...

Klaus_Wei的专栏 2万+

保姆级CVE-2018-17066漏洞复现 DLink命令注入漏洞(更新完结)

之后按照之前复现的方式一样 我们丢到kali中执行binwalk解析。之后为了模拟 可以在kali里安装qemu-mipsel。在bin目录下可以尝试将goahead的环境搭配好。固件官网可以进行下载。

weixin_51339377的博客 879

验证(uvm常见问题)--子类和父类的句柄和对象问题

sv中的子类和父类 在sv中,有如下两个类,child继承于parent。然后在test module中,正确转换的方法如下面所示。其中c1,c2,p1 都指向了同一个子类的对象c1。总结如下: 一个子类的对象是包括子类的成员变量,方法和父类的成员变量,方法。 子类的句柄c1可以直接赋值给父类的句柄p1,此时p1只可以访问父类的成员变量和方法,或者子类的虚方法,比如下面调用p1.display是...

q876507447的博客 7631

生成元的意义

已知P为质数,让我们想象一下 mod P的时钟运算。假设P为13,则mod P的时钟运算中所使用的时钟就是以下13个数字画成的圆形时钟。 0,1,2,3,4,5,6,7,8,9,10,11,12 然后我们来列一张0~12各元素的乘方表 在上表中,注意看G等于2的那一行。 可以发现2的1次方到2的12次方 mod 13的值全都不一样。也就是说,2的乘方结果中出现了1到12的全部整数。...

实践求真知 1万+

告别“盲开”:手把手教你用MCU内置比较器搞定BLDC无感方波启动(附代码片段)

本文详细介绍了如何利用MCU内置比较器实现BLDC无感方波启动,解决传统无传感器控制中的'盲开'问题。通过虚拟中性点电路设计和三段式启动流程,结合反电动势检测和过零检测技术,提供了一套经济高效的解决方案,并附有可直接移植的代码片段,助力工程师快速实现可靠的无感控制。

weixin_33694172的博客 502

返璞归真asp.net mvc 1.0(4) - View/ViewEngine 【转】

介绍asp.net mvc 之 View 和 ViewEngine ViewData 和 TempData 都可以向 View 传递数据,其中 TempData 是保存在 Session 中的,一次请求后此 Session 会被清除HtmlHelper - 在 View 中显示 HTML 元素的一个帮助类IViewEngine - 自定义的视图引擎需要实现此接口VirtualPathProvid...

weixin_34004576的博客 118

6种常用数据分析方法详解:从描述统计到时间序列

数据分析是连接数据与业务决策的桥梁。面对海量数据,掌握描述性统计与对比分析可快速了解现状与差距;相关分析与回归分析能揭示变量间的关联与影响大小;聚类分析用于用户分群,时间序列分析则预测未来走势。这些方法广泛应用于用户画像、销量预测、活动效果评估等场景,是数据分析师和运营人员必备的技能。系统掌握这6种核心方法的使用场景、原理逻辑与实操步骤,能够帮助读者建立完整分析框架,真正用数据驱动业务增长。

weixin_34405354的博客 335

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)算法背景介绍Hessian 矩阵与泰勒多项式关于求t导数与中心点、亚像素点高斯函数作用文献 算法背景介绍 在线结构光视觉传感器中,由线激光器发射出的线结构光,在本质上为一个连续且具有一定厚度的空间光平面,而在目标表面上所形成的具有一定宽度的光条特征,即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上,光强近似服从高斯分布,因而在摄像机采集到的光条图像中,在沿着光条宽度的方向或光条的法线方向上,其灰度也会呈现出类似

jiangxing11的博客 1万+

重读ASP.NET MVC经典系列:理解Web开发架构演进的底层逻辑

ASP.NET MVC 是 .NET Web 开发的奠基性框架,其核心架构思想——请求路由、模型绑定、视图渲染、过滤器管道——构成了现代 Web 框架的通用契约。尽管 ASP.NET Core 已全面演进,但 MVC 的生命周期设计、Action 执行流程、RouteData 与 ModelState 等关键机制仍在新框架中延续并显式暴露。掌握这些基础概念,能显著提升对 Minimal APIs、中间件管道、TagHelper 渲染等高级特性的理解深度与调试效率。本文聚焦‘返璞归真 ASP.NET MVC’

unixboy 463

在实战中学AI-车流量统计项目-YOLOV11车辆检测-YOLOV11模型的部署

考虑实际落地中部署推理资源消耗,速度与模型精度之间的均衡,同时,车辆属于比较通用场景的目标检测,我们将YOLOV11作为最终的模型选择,目前官方开源的模型基于coco数据集训练,里面已经包含了车辆相关类别,经测试,在监控视角下效果基本可用,所以,在落地过程中,我们先用这个模型来打通部署链路,后面再逐步优化模型性能。在Nvidia的硬件下做部署,部署框架优先选择官方框架TensorRT,下面重点讲述如何用TensorRT部署YOLOV11模型。

Aleo_优快云的博客 2165

返璞归真 asp.net mvc 系列文章索引

[×××] 返璞归真 asp.net mvc系列文章索引作者:webabcd介绍返璞归真 asp.net mvc系列文章索引:添加、查询、更新和删除的Demo,路由(System.Web.Routing), Controller/Action, View/ViewEngine, Action Filter, UpdateModel, ModelBinder, Ajax...

weixin_34190136的博客 84

别再手动写JSON了!用Node-RED OPC UA节点5分钟搞定楼宇温湿度数据采集

本文介绍了如何利用Node-RED和OPC UA节点快速实现楼宇温湿度数据的自动化采集与JSON格式转换。通过可视化工具Node-RED,开发者无需编写复杂代码,5分钟内即可完成从传感器到数据输出的全流程配置,大幅提升智慧楼宇和工业物联网项目的实施效率。

weixin_30368405的博客 431

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

ASP.NET MVC 执行流程深度解析:从路由匹配到视图渲染的可调试全链路

ASP.NET MVC 是一种基于约定的 Web 应用开发框架,其核心价值在于显式暴露请求处理的完整生命周期——包括路由解析、模型绑定、动作执行、过滤器调度与视图渲染五大阶段。这种‘契约显性化’设计使开发者能精准定位 404/500 错误根因,尤其在混合架构(如 MVC + Minimal API)或老旧系统升级场景中,成为排查中间件堆叠导致的隐性时序问题的关键能力。技术价值体现在可调试性、组件级可控性与跨版本稳定性上,广泛应用于企业级遗留系统重构、高可靠性后台管理平台及需要强契约约束的 B2B 接口服务。

dejz8829的专栏 515

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ASP.NET没有魔法——ASP.NET MVC Razor与View渲染

  对于Web应用来说,它的界面是由浏览器根据HTML代码及其引用的相关资源进行渲染后展示给用户的结果,换句话说Web应用的界面呈现工作是由浏览器完成的,Web应用的原理是通过Http协议从服务器上获取到对应的Html代码以及相关资源,使得浏览器能够完成正确的呈现工作。   ASP.NET MVC作为一个Web应用构建框架View承担了UI显示的功能,在开发过程中View以Action...

weixin_30929011的博客 198

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[ASP.NET MVC 专题] ViewEngine的发展以及应用

[ASP.NET MVC 专题]     [ASP.NET MVC 专题] 如何为Route构造相关的自定义Configuration     [ASP.NET MVC 专题] ViewEngine的发展以及应用                                                         ViewEngine的发展以及应用 (一)MVC1版本的Vie...

weixin_34413065的博客 180

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

USB端点0控制传输详解:状态机、中断处理与实战避坑指南

在嵌入式系统与USB设备开发中,控制传输是USB协议的基础通信机制,负责设备枚举、配置与管理等关键任务。其核心原理在于通过标准的三段式结构——建立、数据和状态阶段,实现主机与设备间的可靠命令交互。这一机制的技术价值在于为所有USB设备提供了统一、有序的管理通道,是设备稳定运行的基石。在工程实践中,开发者需要深入理解端点0的状态机(IDLE、TX、RX)和关键寄存器(如OUTPKTRDY、INPKTRDY、DATAEND)的协同工作,并编写稳健的中断服务例程来响应主机请求。典型的应用场景包括HID设备、音频接

weixin_33895475的博客 427

Asp.Net MVC4 系列--进阶篇之View

自定义一个ViewEngine 一般的,不需要自定义创建一个View Engine,但为了说明View部分的全貌,先从自定义ViewEngine开始,逐渐全面了解MVCFramework的View部分实现。 需要实现的接口 public interface IViewEngine { ViewEngineResult FindPartialView(ControllerContex...

mybwu_com的专栏 251

返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性

[索引页]<br />[源码下载]<br /><br /><br />返璞归真 asp.net mvc (6) - asp.net mvc 2.0 新特性<br /><br />作者:webabcd<br /><br /><br />介绍<br />asp.net mvc 之 asp.net mvc 2.0 新特性:如通过 DataAnnotations 实现数据验证及客户端验证,MVC 与 Dynamic Data 的结合,对异步 Controller 的支持,对 Area 的支持,新增的一些帮助方法等<

webabcd的专栏 1159
上一篇: 返璞归真asp.net mvc 1.0(3) - Controller/Action
下一篇: 稳扎稳打Silverlight(30) - 2.0Tip/Trick之Silverlight.js, Silverlight.supportedUserAgent.js, 自定义启动界面, 响应鼠标滚轮事件
webabcd
博客等级 码龄17年 28粉丝 911原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值