ASP.NET MVC 视图(三)

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
    {
        MvcHtmlStringCombinationString(string strPar1, string strPar2);
    }
    public class DefaultStringManage: IStringManage
    {
        public MvcHtmlString CombinationString(string strPar1, stringstrPar2)
        {
            returnnew 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 ActionResultIndex(List<Product>model)
{
    ViewBag.StrPar1 = "Thisis";
    ViewBag.StrPar2 = "ViewIoCCase";
    returnView(model);           
}

代码1-4

@inherits MvcApplication.Models.StringManageView
@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
@foreach (varitem 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
    {
        privateIKernel Kernel;
        publicNinjectDependencyResolver()
        {
            Kernel = newStandardKernel();
            AddBinding();
        }
 
        privatevoid AddBinding()
        {
            Kernel.Bind<Models.IStringManage>().To<Models.DefaultStringManage>();
        }
 
        public object GetService(TypeserviceType)
        {
            returnthis.Kernel.TryGet(serviceType);
        }
 
        public IEnumerable<object>GetServices(Type serviceType)
        {
            returnthis.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(newCustomDependencyResolver.NinjectDependencyResolver());

最后看下结果,图2.

图2

自定义视图辅助器

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

using System.Web.Mvc;
 
namespace MvcApplication.CustomHtmlHelper
{
    public static class MyCustomHtmlHelper
    {
        public static MvcHtmlStringCombinationString(this HtmlHelperhtmlHelper, string strPar1, string strPar2)
        {
            returnnew MvcHtmlString(strPar1+ strPar2);
        }
    }
}

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

代码2-2

  <system.web.webPages.razor>
    <hostfactoryType="System.Web.Mvc.MvcWebRazorHostFactory,System.Web.Mvc, Version=3.0.0.0, Culture=neutral,PublicKeyToken=31BF3856AD364E35" />
    <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="MvcApplication.CustomHtmlHelper"/>
      </namespaces>
    </pages>
  </system.web.webPages.razor>

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

代码2-3

@inherits MvcApplication.Models.StringManageView
@usingMvcApplication.CustomHtmlHelper
@{
    ViewBag.Title = "Index";
}
<h2>
    Index</h2>
@foreach (varitem 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

时间: 2024-10-15 16:04:30

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

ASP.NET MVC 视图(五)

ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就是相当于传统webform中的服务器控件,它们都是给我们带来方便的.都是用于生成Html代码的. ASP.NETMVC 视图 l  自定义视图引擎 l Razor视图引擎执行过程 l  Razor视图的依赖注入.自定义视图辅助器 l  分段.分部视图的使用 l  Razor语法.视图辅助器 Razo

ASP.NET MVC 视图(一)

ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲解一下自定义视图引擎的定义和使用,由此慢慢的来了解视图引擎以及视图模块的工作过程. ASP.NETMVC 视图 l 自定义视图引擎简易示例 l Razor视图引擎执行过程 l  Razor视图的依赖注入.自定义视图辅助器 l  分段.分部视图的使用 l  Razor语法.视图辅助器 自定义视图引擎

ASP.NET MVC 视图(四)

ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到,本篇来讲解一下视图中的分段概念.和分部视图的使用. ASP.NET MVC 视图 自定义视图引擎 Razor视图引擎执行过程 Razor视图的依赖注入.自定义视图辅助器 分段.分部视图的使用 Razor语法.视图辅助器 分段.分部视图的使用 分段的使用 在ASP.NET MVC框架的Razor引擎中

ASP.NET MVC 视图(二)

ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个粗略的讲解,目的在于让大家对Razor视图引擎的执行过程留个印象以便联想的思考到视图引擎的作用以及视图在MVC框架中的表示. ASP.NET MVC 视图 自定义视图引擎 Razor视图引擎执行过程 Razor视图的依赖注入.自定义视图辅助器 分段.分部视图的使用 Razor语法.视图辅助器 Raz

ASP.NET MVC 过滤器(三)

ASP.NET MVC 过滤器(三) 前言 本篇讲解行为过滤器的执行过程,过滤器实现.使用方式有AOP的意思,可以通过学习了解过滤器在框架中的执行过程从而获得一些AOP方面的知识(在顺序执行的过程中,这种编程模式就是横向的插入点),言归正传,我们还是以学习过滤器为主.对于IAuthorizationFilter授权认证过滤器的使用篇幅,我知道怎么用但是写不出来,里面包含知识点很多,功底尚浅写了一半又给删掉了,宁愿不发也不能坑人,在后面的学习中假使我可以掌握了,一定会及时的写出来跟大家分享.这个目

(转)Asp.Net Mvc视图引擎Razor介绍

Asp.Net Mvc视图引擎Razor介绍 1.Razor介绍 程序园原创,转载请注明:http://www.kwstu.com/ArticleView/dabaomvc_201408240820545275 1)ASP.NET MVC3 带来了一种新的名为Razor 的视图引擎,提供了下列优点: Razor 的语法简单且清晰,只需要最小化的输入 Razor 容易学习,语法类似于 C# 和 VB Visual Studio 对于 Razor 提供了智能提示和语法着色 Razor 视图不需要允许

为ASP.NET MVC视图输出json

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

Asp.net MVC 视图引擎

Asp.net MVC视图引擎有两种: 1.ASPX View Engine 这个做过WebForm的人都清楚 设计目标:一个用于呈现Web Form页面的输出的视图引擎. 2.Razor View 在Asp.net MVC 3 版本引入的, 可以支持UnitTest,也容易上手. Razor在减少代码冗余.增强代码可读性和vs 智能感知方面,都有着很大的优势. 下面主要讨论下视图引擎 ActionResult 讲到视图引擎,不得不说ActionResult,因为在Controller中,我们看

Asp.net MVC 视图(三)

Html辅助方法(HtmlHelper类) 可以通过视图的Html属性调用HTML辅助方法,也可以通过Url属性调用URL辅助方法,还可以通过Ajax属性调用Ajax辅助方法. 在控制器中也存在Url辅助方法. 所有输出模型值和特性值的辅助方法都会在渲染之前,对值进行HTML编码.例如:< 转义为 < 等. Html辅助方法的工作原理 每个Razor视图都继承了基类的Html属性,Html属性的类型是System.Web.Mvc.HtmlHelper<T>,T代表传递给视图的模型类