MVC3--View层

     Razor二义性:

       1,当view层中出现   邮件格式时候比如   anbylau2130@qq.com 这种情况Razor将会出现多义性

       可以使用@@来转义为一个@字符,

       如:<p>you must follow @james,@jessica,@Andy</p>   这里Razor会以变量的形式解释james,jessica,andy,

          这不是我们想要的效果,所以可以使用@@来转义<p>you must follow @@james,@@jessica,@@Andy</p>

       但是Razor内部做了一般邮箱的识别,

       如:item_@items.Length可能会识别为邮箱地址,那么这时可以在后面加上item_(@items.Length)来计算后面的值

Html编码

  1, Razor表达式是Html编码的

   {

     @string message ="<script>alert('warning')</script>"

    }

    <div>@Message</div>                  这里就不会弹出对话框,而是编码后的html文本

  如果要显示一个对话框

          1,可以使用HtmlString的实例,

          2,可以使用@Html.Raw(message)

  应尽可能的避免脚本注入

 2,如果要在脚本中使用Razor语法,那么最好的解决方案便是   使用@Ajax.JavaScriptStringEncode(ViewBag.UserName)

 代码块

  @foreach(var item in lst)

    {

         <li>this is @item</li>

    }

   @{

           语句

      }

 注释:@**@

   布局

   @{layout=~/Views/Shared/SiteLayout.cshtml}

   @RenderBody()相当于web form中的Placehold控件

   @RenderPatitial() 进行部分视图的绘制

   如果Layout也中定义 <footer>@RenderSection("Footer")</footer> 

    在布局页中使用

    如:index.cshtml中使用以下标签来呈现用户的内容

  @section Footer{
  this is a footer
  }

   footer节点是可选择的如:<footer>@RenderSection("Footer",false)</footer>

也可以如下方法  
<footer> @if (IsSectionDefined("Footer")) { RenderSection("Footer"); } else { <p>has no section</p> }
</footer>

    

 如果在controller中直接返回PartialView(); 那么,视图中将不加载任何布局_Layout.cshtml文件中的内容

在下面的布局中为了减少代码的冗余,采用这种方式

_Layout.cshtml中
@if (ViewBag.Header
== 1) { <script type="text/javascript" src="/js/jquery.loadmask.min.js"></script> } else { <script type="text/javascript" src="/js/jquery.js"></script> } index.cshtml中则在布局头部使用 @{ Layout = "~/Views/Shared/_Layout.cshtml"; ViewBag.Header = 1; } 来加载相应的视图内容

当将分布视图加载带某个页面时可以使用以下方法

<div id="result"></div>
<script>
$(function(){
  $("#result").load('home/message');
});
</script>

配置加载视图引擎

protected void Application_Start()
{
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new myviewEngine()) ;
    RegisterRoutes(RouteTable.Routes);
}
Engines是一个静态的ViewEnginesCollection,Razor引擎和WebForm引擎默认是存在的,所以要先Clear()

查找视图

在创建一个自定义视图引擎的时候,IViewEngines要实现一个关键的接口

  public interface IViewEngine 
   { 
        ViewEngineResult FindView(ControllerContext controllerContext, string viewName,  string masterName, bool useCache);  
        ViewEngineResult FindPartialView(ControllerContext controllerContext,  string partialViewName, bool useCache); 
        void ReleaseView(ControllerContext controllerContext, IView view); 
    } 
FindView,仅在已注册的视图引擎中迭代并调用每一个视图引擎的FindView,然后指定视图名称传递过来,然后ViewEnginesCollection询问每个视图引擎是否可以渲染当前的视图
ViewEngineResult  中存储了是否可以渲染当前视图的答案
view,返回与指定名称对应的并可以找到的Iview实例,如果找不到,返回null
viewEngines,如果能找到一个符合要求的视图,就返回一个IviewEngine实例,否则返回null
searchedlocations返回一个IEnumerable<String> ,其中包含视图引擎搜索到的所有位置、

在实现自定义引擎时Iview接口是需要实现的第二个接口
public interface IView
{ 
    void Render(ViewContent viewcontent,TextWriter txtwriter);
ViewContent 提供自定义视图用到的信息,
HttpContext  封装了asp.net内部对象server,session,request,response
Controller 提供视图引擎的控制器访问
RouteData 对当前路由的访问
ViewData 包含了从Controller传递到视图的数据
TempData 包含了再特殊的单个请求缓存中的数据,由controller传递给视图
View Iview的一个实例。用于渲染
ClientValidationEnable 是否开启客户端数据验证
FormContext 包含客户端验证的窗体信息
FormIdGenerator 允许重写窗体的命名风格
IsChildAction 只是操作是否作为调用Html.Action或者Html.RenderAction
ParentActionViewContext 当IsChildAction==true,包含当前视图的fu视图的ViewContext
Writer HtmlTextWriter使用不返回Html的辅助方法(Html.Form)以便与非WebForm视图兼容

ActionResult还是ViewEngine
原则:它是否对拥有可以知道如何渲染标记的模板文件有意义,如果只有一种方式可以把对象转换为输出格式,那么编写自定义的ActionResult更有意义

 

    

原文地址:https://www.cnblogs.com/anbylau2130/p/3524265.html