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. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  2. 异步编程 In .NET

    概述 在之前写的一篇关于async和await的前世今生的文章之后,大家似乎在async和await提高网站处理能力方面还有一些疑问,博客园本身也做了不少的尝试.今天我们再来回答一下这个问题,同时我们 ...

  3. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  4. [APUE]系统数据文件与信息

    一.口令文件 UNIX口令文件包含下表中的各个字段,这些字段包含在 由于历史原因,口令文件是/bin/passwd,而且是一个文本文件,每一行都包括了上表中的七个字段,字段之间用":&quo ...

  5. ASP.NET Core CORS 简单使用

    CORS 全称"跨域资源共享"(Cross-origin resource sharing). 跨域就是不同域之间进行数据访问,比如 a.sample.com 访问 b.sampl ...

  6. 动手做第一个Chrome插件

    Chrome插件是令人惊讶的简单,一旦你弄懂它的工作和实现原理.它是由一部分HTML,一部分Js,然后混合了一个叫做manifest.json的Json文件组合而成的整体.这意味着你可以使用你最擅长的 ...

  7. css样式之border-image

    border-image-source 属性设置边框的图片的路径[none | <image>] div { border: 20px solid #000; border-image-s ...

  8. iOS 小知识点(持续更新)

    1.如何通过代码设置Button  title的字体大小 设置Button.titleLabel.font = [UIFont systemFontOfSize:<#(CGFloat)#> ...

  9. SharePonit 2010 更改另存为列表模板的语言类型

    从朋友处得来一个列表模板:AccessApplicationSharePoint.stp 将其通过:网站操作----网站设置----列表模板,上传进去.然后去创建列表,发现找不到此模板. 根据多年老司 ...

  10. 最近在玩linux时 yum 遇到了问题

    主要是软件源出现了问题 我做的方式可能比较粗暴 ls -l /etc/yum.repos.d/       /*查看软件源*/ rm -rf /etc/yum.repos.d/   /*全删了*/ m ...