net MVC Framework与django两种web框架的对比和一点理解

最近要和数据结构老师一起开发一个系统,基于架构,老实说我对c#并不是很了解,但是很巧地是我对mvc框架熟知一二,因为我之前就用django做了一个demo论坛,现在还在稳步优化中,(是一个生物信息学论坛,论坛地址:生物信息学论坛,第一次搭建完成的代码,我已经上传到了github,我的github是:reBiocoder(仓库是bioforum))。本身django就是使用地mvc+restful的风格。 所以对理解起来还是比较容易。

这篇文章不涉及到具体的代码实现,主要讲一下大致思路。

mvc框架其实用过django之后就很容易理解了。无非就是讲复制的系统分为control,model,view三层,每层处理不同的部分。

首先用vs2017创建一个框架,

可以看见vs已经自动帮我们搭建好了基本框架。

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

} controller/action/id`,实际上也就是以demoController中的demo,加上该类中的不同方法action,以及参数名id,作为默认的路由。当匹配到这个路由时,很明显,使用.net的url的默认规则时,将能够很容易的发现我需要使用的视图和获取到的参数。(当然这里是可以进行更改的)

这里值得与django对比一下,可以发现在django中的路由配置,使用url()函数,当传入不同的url时,会将获取的参数传递给不同的视图函数,当然叫做视图函数,实际上可以是基于函数试图,也可以是基于类视图。之后视图将结果返回给templates。

比如我们来实验一下: 在controller中新建一个HelloWorldController,写入如下代码:

基本的c#语法就不在这里说了,其中actionresult是一个派生类,用来返回controller中的request处理结果。这里我也与django比较一下,很容易发现,这里的actionresult与django视图中的render和redirect有相同的感觉。

viewbag简单的理解,就是可以用来处理一些参数,然后将它返回给view中。

可以看见,我们最后返回了一个view,那么这个view就需要我们去views进行code。 在theme.cshtml中初始化之后,可以看见如图:

这里的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) 在需要的部分进行插入自己所需要的节。当使用的时候,

.net的这个特性,我不知道是好还是坏,应该是c#语言的特性,在django我们只需要{%block name%}就可以对所有情况进行判断。从实用的角度来讲,我个人认为django的继承规则要更加简单

我们来进行一个简单的操作: 当在theme.cshtml中什么也不写的时候,可以发现renderbody缺失时,并不会出现任何的异常。

当我在controller中调用 可以发现,能够成功实现,

这里再介绍一下加入超链接的方法:

例如

其实这里的超链接的写法,在django中我们可以直接使用{%url 'namespace' %}来表示,也十分的简单

我的博客:echor'blog

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180929G0D2NX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券