.net MVC Framework與django兩種web框架的對比和一點理解

最近要和數據結構老師一起開發一個系統,基於.net mvc架構,老實說我對c#並不是很瞭解,但是很巧地是我對mvc框架熟知一二,因為我之前就用django做了一個demo論壇,現在還在穩步優化中,(是一個生物信息學論壇,論壇地址:生物信息學論壇,第一次搭建完成的代碼,我已經上傳到了github,我的github是:reBiocoder(倉庫是bioforum))。本身django就是使用地mvc+restful的風格。 所以對.net mvc理解起來還是比較容易。


這篇文章不涉及到具體的代碼實現,主要講一下大致思路。

mvc框架其實用過django之後就很容易理解了。無非就是講複製的系統分為control,model,view三層,每層處理不同的部分。

  • 首先用vs2017創建一個.net mvc框架,
.net MVC Framework與django兩種web框架的對比和一點理解

可以看見vs已經自動幫我們搭建好了基本框架。

在App_start中有一個routeconfig.cs,這個就是路由配置文件: ``` namespace test { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

} `` 可以看見,.net的路由配置,默認是controller/action/id`,實際上也就是以demoController中的demo,加上該類中的不同方法action,以及參數名id,作為默認的路由。當匹配到這個路由時,很明顯,使用.net的url的默認規則時,將能夠很容易的發現我需要使用的視圖和獲取到的參數。(當然這裡是可以進行更改的)

這裡值得與django對比一下,可以發現在django中的路由配置,使用url()函數,當傳入不同的url時,會將獲取的參數傳遞給不同的視圖函數,當然叫做視圖函數,實際上可以是基於函數試圖,也可以是基於類視圖。之後視圖將結果返回給templates。

比如我們來實驗一下: 在controller中新建一個HelloWorldController,寫入如下代碼:

public class HelloWorldController : Controller
{
// GET: HelloWorld

public ActionResult Theme()
{
ViewBag.title = "一個測試";
return View();
}
}

基本的c#語法就不在這裡說了,其中actionresult是一個派生類,用來返回controller中的request處理結果。 這裡我也與django比較一下,很容易發現,這裡的actionresult與django視圖中的render和redirect有相同的感覺。

viewbag簡單的理解,就是可以用來處理一些參數,然後將它返回給view中。

可以看見,我們最後返回了一個view,那麼這個view就需要我們去views進行code。 在theme.cshtml中初始化之後,可以看見如圖:

.net MVC Framework與django兩種web框架的對比和一點理解

這裡的Layout其實就是基礎模板,也其實就是django中的base.html,這裡的語法是Razor的語法,個人理解就是為了讓c#在thml中能夠生效而衍生的一個語法規則,和c#差不太多。

為了更好的理解模板繼承,我們可以去看看_layout.cshtml.


這裡簡單介紹一下,.net的模板繼承規則: 在views中會有一個_viewstart.cshtml的文件,實際上,在views中其他所有的cshtml加載之前都會加載它,在這裡可以寫入一些所有模板都需要的規則,其中還有一個shared文件夾,裡面放的是一些能夠共享模板文件。所有的控制器都能夠使用。_layout.cshtml就包括在其中。


查看_layout.cshtml源文件可以發現: 在.net中,有三種繼承方式: 1. RenderBody 2. RenderPage 3. RenderSection

這三種render的各自功能分別是: renderbody,能夠直接將子模板中的內容合併到_layout.cshtml中的renderbody的位置,在子模板中不需要任何的code,可以直接繼承。 renderpage("需要插入的cshtml"),renderpage是能夠在模板中進行加入操作。 @rendersection(“name”,required:false) 在需要的部分進行插入自己所需要的節。當使用的時候,@section name{內容}

.net的這個特性,我不知道是好還是壞,應該是c#語言的特性,在django我們只需要{%block name%}就可以對所有情況進行判斷。從實用的角度來講,我個人認為django的繼承規則要更加簡單

我們來進行一個簡單的操作: 當在theme.cshtml中什麼也不寫的時候,可以發現renderbody缺失時,並不會出現任何的異常。

.net MVC Framework與django兩種web框架的對比和一點理解

當我在controller中調用@section test{

你好,世界!

} 可以發現,能夠成功實現,
.net MVC Framework與django兩種web框架的對比和一點理解


這裡再介紹一下加入超鏈接的方法: @html.actionlink("name","action","controller","params","css屬性")

例如 @html.actionlink("我的主頁","theme","Themecontroller",new {id=1},new {target="_blank",@class="title"})

其實這裡的超鏈接的寫法,在django中我們可以直接使用{%url 'namespace' %}來表示,也十分的簡單


我的博客:echor'blog

更多優質內容,請關注微信公眾號:生物信息與python


分享到:


相關文章: