ASP.NET MVC 视图()

前言

上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的视图,最后还会简单的介绍一下自定义的视图辅助器是怎么定义和使用的。

ASP.NET MVC 视图

  • 自定义视图引擎
  • Razor视图引擎执行过程
  • Razor视图的依赖注入、自定义视图辅助器
  • 分段、分部视图的使用
  • Razor语法、视图辅助器

Razor视图的依赖注入

首先我们来看一下要定义实现依赖注入的功能接口规范和默认实现,示例代码1-1.

代码1-1

using System.Web.Mvc;
using Ninject; namespace MvcApplication.Models
{
public interface IStringManage
{
MvcHtmlString CombinationString(string strPar1, string strPar2);
}
public class DefaultStringManage : IStringManage
{
public MvcHtmlString CombinationString(string strPar1, string strPar2)
{
return new MvcHtmlString(strPar1 + strPar2);
}
} }

在IStringManage类型中定义了CombinationString()方法,用于将两个字符串类型的数值拼接起来,DefaultStringManage类型就是默认实现了,这里就不多说了。

下面我们再来定义在编译时刻视图将要实现继承的类型,示例代码1-2

代码1-2

using System.Web.Mvc;
using Ninject; namespace MvcApplication.Models
{
public abstract class StringManageView : WebViewPage
{
[Inject]
public IStringManage StringManage { get; set; }
}
}

这样的定义起初是不会有什么问题的,因为cshtml视图文件在编译时是继承自WebViewPage类型的,现在我们要让cshtml视图所继承的类型是StringManageView,所以必须让StringmanageView继承自WebViewPage,因为WebViewPage是抽象类型,而我们又不想实现什么所以要定义为抽象类型,在StringManageView类型中,我定义了IStringManage类型的属性StringMange,并且使用IoC框架中的Inject特性来描述它,使的在编译是可以通过IoC来实现属性的依赖注入。

下面我们来看一下视图代码,这里的视图代码还是引用前面篇幅使用最多的一个示例,代码1-3和代码1-4

代码1-3

public ActionResult Index(List<Product> model)
{
ViewBag.StrPar1 = "This is";
ViewBag.StrPar2 = "ViewIoCCase";
return View(model);
}

代码1-4

@inherits MvcApplication.Models.StringManageView
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
@foreach (var item in Model)
{
<h3>ID: @item.ID Name:@item.Name</h3>
}
<h2>@StringManage.CombinationString(ViewBag.StrPar1, ViewBag.StrPar2)</h2>

控制器方法部分的代码定义是没有问题的,在代码1-4,也就是Index视图的定义中通过@inherits指令来使视图文件在编译时继承自某个类型,以及在下面的使用中用到了StringManage属性,并且还调用了方法,这里看起来都没什么问题,但是放在这里用就有问题了,因为上面使用了foreach来遍历Model,在我们定义StringManageView的时候并没有对Model的类型做约束什么的,而控制器方法中也是需要将List<Product>类型传递到视图的,这里就引起了冲突,图1.

图1

遇到这种情况我们只需修改一下代码1-2中的定义,让Model类型是在编译时是可确定的而不是object类型,来看代码1-5

代码1-5

public abstract class StringManageView : WebViewPage<dynamic>
{
[Inject]
public IStringManage StringManage { get; set; }
}

对的,让StringManageView实现泛型的WebViewPage就可以了,上个篇幅中视图的基类也都是这样定义的,不是说上面代码1-2定义的就是错误的,定义的没有错,只是应用的视图不合适,因为Index视图本身需要对Model做一些操作,又不想因为为视图添加的依赖注入功能而修改所以才会引起的这个错误,如果放在普通的视图里使用那是没有问题的。

上面这些都定义好了,下面我们需要实现自定义的IDependencyResolver类型,目的在于绑定我们需要进行依赖注入的功能模块到IoC中,代码1-6.

代码1-6

using Ninject;
using System.Web.Mvc; namespace MvcApplication.CustomDependencyResolver
{
public class NinjectDependencyResolver:IDependencyResolver
{
private IKernel Kernel;
public NinjectDependencyResolver()
{
Kernel = new StandardKernel();
AddBinding();
} private void AddBinding()
{
Kernel.Bind<Models.IStringManage>().To<Models.DefaultStringManage>();
} public object GetService(Type serviceType)
{
return this.Kernel.TryGet(serviceType);
} public IEnumerable<object> GetServices(Type serviceType)
{
return this.Kernel.GetAll(serviceType);
}
}
}

对于代码1-6就不作过多的解释了,在控制器激活部分都讲解过近乎类似的注入封装类型。

最后我们在Global.asax文件的Application_Start()方法中,将Model绑定器和NinjectDependencyResolver类型添加中MVC框架中,代码1-7

代码1-7

ModelBinders.Binders.Add(typeof(List<Product>), new CustomListModelBinder());
DependencyResolver.SetResolver(new CustomDependencyResolver.NinjectDependencyResolver());

最后看下结果,图2.

图2

自定义视图辅助器

实际上自定义视图辅助器就是扩展方法的定义,首先我们来看定义,实现的功能同代码1-1相同,代码2-1

using System.Web.Mvc;

namespace MvcApplication.CustomHtmlHelper
{
public static class MyCustomHtmlHelper
{
public static MvcHtmlString CombinationString(this HtmlHelper htmlHelper, string strPar1, string strPar2)
{
return new MvcHtmlString(strPar1 + strPar2);
}
}
}

代码2-1这样的一个类型也就是自定义视图辅助器了,当然了这只是一个简单的示例,现在我们需要把它在视图中使用起来,我们得先把这个自定义的视图辅助器所在的命名空间添加到Views文件中的Web.Config中,代码2-2.

代码2-2

 <system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="MvcApplication.CustomHtmlHelper"/>
</namespaces>
</pages>
</system.web.webPages.razor>

然后是在视图中引用扩展方法所处的命名空间, 这样配置过后就可以在视图用运用了我们刚刚自定义的视图辅助器了,代码2-3.

代码2-3

@inherits MvcApplication.Models.StringManageView
@using MvcApplication.CustomHtmlHelper
@{
ViewBag.Title = "Index";
}
<h2>
Index</h2>
@foreach (var item in Model)
{
<h3>ID: @item.ID Name:@item.Name</h3>
}
<h2>@StringManage.CombinationString(ViewBag.StrPar1, ViewBag.StrPar2)</h2>
@Html.CombinationString("This is a ","Case")

最后我们看一下结果如图3.

图3

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET MVC 视图(三)的更多相关文章

  1. ASP.NET MVC 视图(五)

    ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...

  2. ASP.NET MVC 视图(四)

    ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...

  3. ASP.NET MVC 视图(一)

    ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...

  4. 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  5. ASP.NET MVC 视图(二)

    ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个 ...

  6. ASP.NET MVC 路由(三)

    ASP.NET MVC路由(三) 前言 通过前两篇的学习会对路由系统会有一个初步的了解,并且对路由系统中的Url规则有个简单的了解,在大家的脑海中也有个印象了,那么路由系统在ASP.NETMVC中所处 ...

  7. ASP.NET MVC 过滤器(三)

    ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中, ...

  8. 为ASP.NET MVC视图输出json

    做个小小练习,为asp.net mvc视图输出json字符串: 创建JsonResult操作: 创建此视图: 浏览结果:

  9. Asp.net MVC 视图引擎

    Asp.net MVC视图引擎有两种: 1.ASPX View Engine 这个做过WebForm的人都清楚 设计目标:一个用于呈现Web Form页面的输出的视图引擎. 2.Razor View ...

随机推荐

  1. 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...

  2. C#4.0泛型的协变,逆变深入剖析

    C#4.0中有一个新特性:协变与逆变.可能很多人在开发过程中不常用到,但是深入的了解他们,肯定是有好处的. 协变和逆变体现在泛型的接口和委托上面,也就是对泛型参数的声明,可以声明为协变,或者逆变.什么 ...

  3. Android中手机录屏并转换GIF的两种方式

    之前在博文中为了更好的给大家演示APP的实现效果,本人了解学习了几种给手机录屏的方法,今天就给大家介绍两种我个人用的比较舒服的两种方法: (1)配置adb环境后,使用cmd命令将手机界面操作演示存为视 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. 代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

    坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

  6. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

    Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...

  7. css中line-height行高的深入学习

    之前对css中行高line-height的理解还是有些肤浅,深入后才发觉里面包罗万象.学习行高line-height,首先从基本原理开始 (标注该文章转载 http://www.cnblogs.com ...

  8. arcgis api for js入门开发系列六地图分屏对比(含源代码)

    上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...

  9. MongoDB学习笔记五—查询上

    数据准备 { , "goods_name" : "KD876", "createTime" : ISODate("2016-12- ...

  10. Linux命令【第二篇】

    1.如何过滤出已知当前目录下oldboy中的所有一级目录(提示:不包含oldboy目录下面目录的子目录及隐藏目录,即只能是一级目录). ^:以什么开头,例如^olboy表示以oldboy开头. ls: ...