ASP.NET MVC 視圖(三)

ASP.NET MVC 視圖()

前言

上篇對於Razor視圖引擎和視圖的類型作了大概的講解,想必你們對視圖的自己也有所瞭解,本篇將利用IoC框架對視圖的實現進行依賴注入,在此過程過會讓你們更瞭解的視圖,最後還會簡單的介紹一下自定義的視圖輔助器是怎麼定義和使用的。html

 

ASP.NET MVC 視圖

  • 自定義視圖引擎
  • Razor視圖引擎執行過程
  • Razor視圖的依賴注入、自定義視圖輔助器
  • 分段、分部視圖的使用
  • Razor語法、視圖輔助器

 

Razor視圖的依賴注入

首先咱們來看一下要定義實現依賴注入的功能接口規範和默認實現,示例代碼1-1.web

代碼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類型就是默認實現了,這裏就很少說了。this

下面咱們再來定義在編譯時刻視圖將要實現繼承的類型,示例代碼1-2spa

代碼1-23d

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來實現屬性的依賴注入。code

下面咱們來看一下視圖代碼,這裏的視圖代碼仍是引用前面篇幅使用最多的一個示例,代碼1-3和代碼1-4htm

代碼1-3blog

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/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面

相關文章
相關標籤/搜索