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(转)的更多相关文章

  1. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  2. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  3. Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。

    场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...

  4. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  5. ASP.NET Core MVC 中的 [Controller] 和 [NonController]

    前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...

  6. ASP.NET MVC中利用AuthorizeAttribute实现访问身份是否合法以及Cookie过期问题的处理

    话说来到上海已经快半年了,时光如白驹过隙,稍微不注意,时间就溜走了,倒是没有那么忙碌,闲暇之际来博客园还是比较多的,记得上次在逛博问的时候看到有同志在问MVC中Cookie过期后如何作相关处理,他在阐 ...

  7. 4.在MVC中使用仓储模式进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...

  8. 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  9. 2.ASP.NET MVC 中使用Crystal Report水晶报表

    上一篇,介绍了怎么导出Excel文件,这篇文章介绍在ASP.NET MVC中使用水晶报表. 项目源码下载:https://github.com/caofangsheng93/CrystalReport ...

随机推荐

  1. cxf的使用及安全校验-02创建简单的客户端接口

    上一篇文章中,我们已经讲了如果简单的创建一个webservice接口 http://www.cnblogs.com/snowstar123/p/3395568.html 现在我们创建一个简单客户端接口 ...

  2. OpenGL ES 2.0 雾

    在场景中使用雾不但可以提高真实感,特定的情况下还能优化性能.具体是指当物体离摄像机足够远时,雾就足够浓,此时只能看到雾而看不到物体,也就不必对物体着色进行详细计算,这样可以大大提高渲染效率. 雾有很多 ...

  3. mysql update语句,修改字段,,或者是批量修改字段

    更新一个字段,在它的后面加一个字符串,不查询数据库得到这个字段值 怎么添加?? 例如: 我的test表,有个user字段,我现在想在它后面加了另一个用户的名字 我在mysql数据库这样写 UPDATE ...

  4. Oracle11g R2学习系列 之六数据库链接,快照及序列

    Create public database link link_name Connect to user identified by password using 'DBName' 为'DBName ...

  5. eclipse添加xsd

    图片参考 http://wenku.baidu.com/link?url=DFHWF_yD-M-GCt2tfjs1npPs1xhNlyxik7i_pCBjw3oVlbssYrMvLNucuUpKg75 ...

  6. ACboy needs your help(HDU 1712 分组背包入门)

    ACboy needs your help Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. 在Ubuntu上安装VmTools

    1.添加VmTools 2.解压 .tag.gz文件 使用Linux命令: tar –zxvf src –c dis -c: 建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 ...

  8. getResources().getXml()获取xml

    获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是 ...

  9. 编程是一项需要时间来掌握的技能(Anders的经验)

    Anders现在每天仍然花大量的时间实际写代码,并且未来会一直写下去.他很清醒的知道自己长处:“相比起管理,我还是更擅长于编程.” 事实上,Anders的成名之作Turbo Pascal通过出售软件授 ...

  10. Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现

    Android 图片合成:添加蒙板效果 不规则相框 透明度渐变效果的实现 暂时还未有时间开发这效果,所以先贴出来. 先贴一张效果图,这是一张手机截屏: 左上方的风景图:背景图片 右上方的人物图:前景图 ...