MVC中的View2(转)
MVC中View是专门用来向浏览器显示结果的,它只负责把传入到View的数据展现给用户;
一,自定义view引擎:实现IViewEngine接口
namespaceSystem.Web.Mvc
{
publicinterface IViewEngine
{
ViewEngineResultFindView(ControllerContext controllerContext, string viewName,
stringmasterName, bool useCache);
ViewEngineResultFindPartialView(ControllerContext controllerContext,
stringpartialViewName, bool useCache);
voidReleaseView(ControllerContext controllerContext, IView view);
}
}
当ViewResult被处理时,.net会调用FindView或FindPartialView,最后返回的ViewEngineResult用来负责当.net需要一个view时的工作;
ReleaseView是一个view生成结束后调用的
publicViewEngineResult(IView view, IViewEngine viewEngine):正常处理
或者public ViewEngineResult(IEnumerable<string>searchedLocations):当对应的view找不到时,反馈给用信息
namespaceSystem.Web.Mvc
{
usingSystem.IO;
publicinterface Iview
{
voidRender(ViewContext viewContext, TextWriter writer);
}
}
1,自定义view:
using System.IO;
using System.Web.Mvc;
namespaceViews.Infrastructure.CustomViewEngine
{
publicclass DebugDataView : IView
{
publicvoid Render(ViewContext viewContext, TextWriter writer)
{
Write(writer,"---Routing Data---");
foreach(string key in viewContext.RouteData.Values.Keys)
{
Write(writer,"Key: {0}, Value: {1}",
key,viewContext.RouteData.Values[key]);
}
Write(writer,"---View Data---");
foreach(string key in viewContext.ViewData.Keys)
{
Write(writer,"Key: {0}, Value: {1}", key,
viewContext.ViewData[key]);
}
}
privatevoid Write(TextWriter writer, string template, params object[] values)
{
writer.Write(string.Format(template,values) + "<p/>");
}
}
}
2,自定义ViewEngine
namespaceViews.Infrastructure.CustomViewEngine
{
publicclass DebugDataViewEngine : IViewEngine
{
publicViewEngineResult FindView(ControllerContext controllerContext,
stringviewName, string masterName, bool useCache)
{
if(viewName == "DebugData")
{
returnnew ViewEngineResult(new DebugDataView(), this);
}
else{
returnnew ViewEngineResult(new string[] { "Debug Data View Engine" });
}
}
publicViewEngineResult FindPartialView(ControllerContext controllerContext,
stringpartialViewName, bool useCache)
{
returnnew ViewEngineResult(new string[] { "Debug Data View Engine" });
}
publicvoid ReleaseView(ControllerContext controllerContext, IView view)
{
//do nothing
}
}
}
3,注册自定义的ViewEngine
protected voidApplication_Start()
{
AreaRegistration.RegisterAllAreas();
ViewEngines.Engines.Add(newDebugDataViewEngine());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
二:通过MVC提供的EngineRazir
1,Razir中,view被转换成C#类
@model string[]
@{
ViewBag.Title ="Index";
}
This is a list offruit names:
@foreach (string namein Model)
{
<span><b>@name</b></span>
}
被转换为:
namespace ASP
{
usingSystem;
usingSystem.Collections.Generic;
usingSystem.IO;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Web;
usingSystem.Web.Helpers;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.WebPages;
usingSystem.Web.Mvc;
usingSystem.Web.Mvc.Ajax;
usingSystem.Web.Mvc.Html;
usingSystem.Web.Routing;
publicclass _Page_Views_Home_Index_cshtml :System.Web.Mvc.WebViewPage<string[]>
{
public_Page_Views_Home_Index_cshtml()
{
}
publicoverride void Execute()
{
WriteLiteral("\r\n");
ViewBag.Title= "Index";
WriteLiteral("\r\nThisis a list of fruit names:\r\n\r\n");
foreach(string name in Model)
{
WriteLiteral("<span><b>");
Write(name);
WriteLiteral("</b></span>\r\n");
}
}
}
}
当第一个请求view的request到达时,Razor会把所有的view:.cshtml文件转化为相应的C#类,且类名和.csthml文件名相关,Razor通过对应的map,得到C#类;
转换方式:@直接被转换为C#语句开始;
Razor通过该完整的C#类,形成静态和动态内容,并且通过TextWrite把内容写到客户端
2,向Razor view中注入自定义的接口,通过属性注入的方式,取消接口依赖注入:
①定义抽象类继承自:WebViewPage
using System.Web.Mvc;
using Ninject;
namespaceViews.Models.ViewClasses
{
publicabstract class CalculatorView : WebViewPage
{
[Inject]
publicICalculator Calulator { get; set; }
}
}
②在View中进行相关的声明:
@inheritsViews.Models.ViewClasses.CalculatorView
@{
ViewBag.Title ="Calculate";
}
<h4>Calculate</h4>
The calculationresult for @ViewBag.X and @ViewBag.Y is @Calulator.Sum(ViewBag.X, ViewBag.Y)
通过@inherits Views.Models.ViewClasses.CalculatorView来指定此view的C#类继承自我们声明的抽象类;
③View被转换的C#类如下:
public class_Page_Views_Home_Calculate_cshtml : Views.Models.ViewClasses.CalculatorView {
...
}
3改变RazorEngine的一些设置,比如默认的view的寻找位置…
①声明一个类,继承自RazorViewEngine();在类的构造方法里改变RazorViewEngine的相关属性值
②在app_start()里注册:
protected voidApplication_Start()
{
AreaRegistration.RegisterAllAreas();
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(newCustomRazorViewEngine());
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
4,向Razor View中应用动态数据:
①:通过内置的代码行:@
在webForm中,ASPX页面通过把标记和过程逻辑相分离,而Razor中则是把表现和逻辑相分离,在View中只负责内容的表现
向View中添加引用:
i,向View中添加引用:@using
ii,通过配置views\web.Config
<system.web.webPages.razor>
<pagespageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<addnamespace="System.Web.Mvc" />
<addnamespace="System.Web.Mvc.Ajax" />
<addnamespace="System.Web.Mvc.Html" />
<addnamespace="System.Web.Routing" />
<addnamespace="DynamicData.Infrastructure"/>
</namespaces>
</pages>
</system.web.webPages.razor>
通过@语句块输出的内容,会被Razor进行转义后输出:<>...可能会和相关标记混淆的地方均用html专业标记输出;
要返回原本期望的字符串,可通过以下几种方法:
i:MvcHtmlString();
ii:@Html.Raw
Html helper:来实现重复代码的减少,即定义相关的方法:
i:通过内置的代码行:@helper
@helperCreateList(string[] items)
{
<ul>
@foreach(string item in items)
{
<li>@item</li>
}
</ul>
}
ii:通过扩展方法:
usingSystem.Web.Mvc;
namespaceDynamicData.Infrastructure.HtmlHelpers
{
publicstatic class CustomHtmlHelpers
{
publicstatic MvcHtmlString List(this HtmlHelper html, string[] listItems)
{
TagBuildertag = new TagBuilder("ul");
foreach(string item in listItems)
{
TagBuilderitemTag = new TagBuilder("li");
itemTag.SetInnerText(item);
tag.InnerHtml+= itemTag.ToString();
}
return new MvcHtmlString(tag.ToString());
}
}
}
5使用创建好的HTML Helpers
1,创建表单Form:Html.BeginForm和Html.EndForm
@{Html.BeginForm("Action","Controller")}:创建<form>标签
@{Html.EndForm()}:创建</form>
或者
@using(Html.BeginForm("Action","Controller"))
{
}
等效于:
<form action="通过路由系统反映射出的路径" method="Post">
</form>
Html.BeginForm会创建一个MvcForm类的实例,用来生成form的开始标签,而且该类实现了IDispose接口,会在Dispose时自动创建form的结束标签
当不指定 Html.BeginForm的参数时,该表单默认会提交在原页面路径(即其提交的Controller和Action都不变)。在MVC模式中,一个表单的初次显示和需要提交数据时的可以是同一个路径,在Controller里可以创建两个Action,分别应用[HttpPost]和[HttpGet]属性,其中,get属性的Action用来显示Form内容,Post的Action则用来显示和处理提交的表单
2,创建input元素,包括普通的input和与Module相关联的input元素;
3,添加Attribute到html标记中:
在@htmlHelp的方法里,都有接受属性的参数new{@class="MyCss",CustomAttr="SomeValue"}
4,创建DropDownList
Drop-down listHtml.DropDownList("myList", new SelectList(new [] {"A","B"}), "Choose")
Output:
<selectid="myList" name="myList">
<optionvalue="">Choose</option>
<option>A</option>
<option>B</option>
</select>
5,创建Grid
@modelIEnumerable<DynamicData.Models.Product>
@{
var grid = newWebGrid(
source: Model,
rowsPerPage: 4);
}
@grid.GetHtml(
tableStyle:"grid",
headerStyle:"header",
rowStyle:"row",
footerStyle:"footer",
alternatingRowStyle:"altRow",
columns: grid.Columns(
grid.Column("Name","Item", style:"textCol"),
grid.Column("Price",style: "numberCol",
format:@<text>$@string.Format("{0:F2}", item.Price) </text>)
))
6,使用Section和PartView
@RenderSection和@Html.PartView
7,ChildAction:当需要在许多页面中包含某一逻辑处理,但不想在每一个一面中重复此段功能代码时,可创建ChildAction,ChildAction返回一个PartView或者其他结果,可以在View中直接调用;
[ChildAction]
…..ActionName()….
在View中,直接通过@Html.Action("ActionName"),即可嵌入此结果
MVC中的View2(转)的更多相关文章
- .NetCore MVC中的路由(2)在路由中使用约束
p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...
- ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理
话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 2.ASP.NET MVC 中使用Crystal Report水晶报表
上一篇,介绍了怎么导出Excel文件,这篇文章介绍在ASP.NET MVC中使用水晶报表. 项目源码下载:https://github.com/caofangsheng93/CrystalReport ...
随机推荐
- 提高jQuery执行效率
1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能. 下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的j ...
- easyUI的doCellTip 就是鼠标放到单元格上有个提示的功能
1:这个东西是我抄的(抄的哪儿的我就想不起来了- -)弹出的窗没有样式 不是很好看 //扩展 $.extend($.fn.datagrid.methods, { /** * 开打提示功能 * @pa ...
- Json部分知识(前台显示格式、Json-lib日期处理)
1,Json格式用于datagrid数据显示 easyui前台显示数据可以使用JSONObject,也可以使用JSONArray.但是如果需要在datagrid表格中进行数据显示,只能使用JSONOb ...
- OpenGL ES 2.0 向量
访问向量中的某个分量<向量名>.<分量名> 将一个向量看作位置时,可以使用x.y.z.w4个分量名,其分别代表X轴.Y轴.Z轴.向量的模. 将一个向量看作颜色时,可以使用r.g ...
- hdu Red and Black
算法:深搜 题意:就是让你找到一共可以移动多少次,每次只能移到黑色格子上, Problem Description There is a rectangular room, covered with ...
- GTD:是一种态度
时间管理发展的四个阶段: 第一代理论着重利用便条与备忘录,在忙碌中调配时间与精力: 第二代理论强调行事历与日程表,反映出时间管理已注意到规划未来的重要: 第三代理论正是目前流行的优先级观念.也就是依据 ...
- JavaScript高级程序设计第14章表单脚本 (学习笔记)
第十四章 表单脚本 1.阻止默认表单提交 1.提交表单数据 1.使用type=submit提交按钮 2.使用submit():方法 注意:当用户点击提交按钮时,会触发submit事件,从而在这里我们有 ...
- php json_encode数据格式化2种格式[]和{}
在php中,json格式化数据后,会出现2种形式数据: 1.当array是一个从0开始的连续数组时,json_encode的结果是一个由[]括起来的字符串 $arr = array('a' , 'b' ...
- Python基础第四天
必须掌握的内置函数 bytes() divmod() eval() exec() isinstance() range() 常用函数 1.数学相关 abs(x) abs()返回一个数字的绝对值.如果给 ...
- python列表sort方法的两个参数key, reverse
使用列表的sort方法可以进行排序,其中有两个参数用来表示排序的方式,代码: In [7]: a = ['x11','abc323','e26','112ddd'] In [8]: a.sort(ke ...