溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ASP.NET MVC 視圖(三)

發(fā)布時間:2020-07-13 03:19:53 來源:網(wǎng)絡(luò) 閱讀:843 作者:jinyuan0829 欄目:編程語言

ASP.NET MVC 視圖()

前言

上篇對于Razor視圖引擎和視圖的類型做了大概的講解,想必大家對視圖的本身也有所了解,本篇將利用IoC框架對視圖的實現(xiàn)進行依賴注入,在此過程過會讓大家更了解的視圖,最后還會簡單的介紹一下自定義的視圖輔助器是怎么定義和使用的。


ASP.NET MVC 視圖

l  自定義視圖引擎

l Razor視圖引擎執(zhí)行過程

l Razor視圖的依賴注入、自定義視圖輔助器

l  分段、分部視圖的使用

l  Razor語法、視圖輔助器



 

Razor視圖的依賴注入

首先我們來看一下要定義實現(xiàn)依賴注入的功能接口規(guī)范和默認實現(xiàn),示例代碼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()方法,用于將兩個字符串類型的數(shù)值拼接起來,DefaultStringManage類型就是默認實現(xiàn)了,這里就不多說了。

下面我們再來定義在編譯時刻視圖將要實現(xiàn)繼承的類型,示例代碼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類型的,現(xiàn)在我們要讓cshtml視圖所繼承的類型是StringManageView,所以必須讓StringmanageView繼承自WebViewPage,因為WebViewPage是抽象類型,而我們又不想實現(xiàn)什么所以要定義為抽象類型,在StringManageView類型中,我定義了IStringManage類型的屬性StringMange,并且使用IoC框架中的Inject特性來描述它,使的在編譯是可以通過IoC來實現(xiàn)屬性的依賴注入。

下面我們來看一下視圖代碼,這里的視圖代碼還是引用前面篇幅使用最多的一個示例,代碼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";
}
<h3>
    Index</h3>
@foreach (varitem in Model)
{
    <h4>ID: @item.ID Name:@item.Name</h4>
}
<h3>@StringManage.CombinationString(ViewBag.StrPar1,ViewBag.StrPar2)</h3>


 

控制器方法部分的代碼定義是沒有問題的,在代碼1-4,也就是Index視圖的定義中通過@inherits指令來使視圖文件在編譯時繼承自某個類型,以及在下面的使用中用到了StringManage屬性,并且還調(diào)用了方法,這里看起來都沒什么問題,但是放在這里用就有問題了,因為上面使用了foreach來遍歷Model,在我們定義StringManageView的時候并沒有對Model的類型做約束什么的,而控制器方法中也是需要將List<Product>類型傳遞到視圖的,這里就引起了沖突,圖1.

1

ASP.NET MVC 視圖(三)

遇到這種情況我們只需修改一下代碼1-2中的定義,讓Model類型是在編譯時是可確定的而不是object類型,來看代碼1-5

代碼1-5

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


對的,讓StringManageView實現(xiàn)泛型的WebViewPage就可以了,上個篇幅中視圖的基類也都是這樣定義的,不是說上面代碼1-2定義的就是錯誤的,定義的沒有錯,只是應(yīng)用的視圖不合適,因為Index視圖本身需要對Model做一些操作,又不想因為為視圖添加的依賴注入功能而修改所以才會引起的這個錯誤,如果放在普通的視圖里使用那是沒有問題的。

上面這些都定義好了,下面我們需要實現(xiàn)自定義的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());

最后看下結(jié)果,圖2.

2

ASP.NET MVC 視圖(三)

 

 

自定義視圖輔助器

實際上自定義視圖輔助器就是擴展方法的定義,首先我們來看定義,實現(xiàn)的功能同代碼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這樣的一個類型也就是自定義視圖輔助器了,當然了這只是一個簡單的示例,現(xiàn)在我們需要把它在視圖中使用起來,我們得先把這個自定義的視圖輔助器所在的命名空間添加到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";
}
<h3>
    Index</h3>
@foreach (varitem in Model)
{
    <h4>ID: @item.ID Name:@item.Name</h4>
}
<h3>@StringManage.CombinationString(ViewBag.StrPar1,ViewBag.StrPar2)</h3>
@Html.CombinationString("This is a ","Case")


最后我們看一下結(jié)果如圖3.

3

ASP.NET MVC 視圖(三)

 


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI