asp.net的MVC编程、URL重写以及MV编程 .

ASP.NET MVC URL重写与优化 立即下载
前一段时间做一个网站项目,使用win2003+.net2.0开发;在学习了一些.net的相关知识后,并考虑到此项目需要多人合作,以及架构清晰、 URL重写等优点,决定用MVC方式开发。但微软的asp.net MVC框架据说要下半年才出正式版,而且还需要.net3.5,其他的MVC框架又不熟悉,估计也需要一段时间学习。由于开发时间比较紧,我们开发小组中也没有一个对asp.net及asp.net MVC框架非常精通的人,所以又想转回使用传统的asp.net编程方式开发。
  在两难之际,我想也许可以在项目需求出来前,自己试着写一个MVC架构出来,因为以前曾用PHP和JSP写过类似的MVC架构,而Web的运行环境和编程语言,相通的地方还是很多的,于是就有了下面这个asp.net的MVC架构。
   一、MVC编程:
  针对用户的浏览器来说,网站可以看作一个实体、一个接口,其接收浏览器的请求,并将相应的信息返回给浏览器;因此,网站程序完全可以用一个程序来完成,而实际上也确实如此,IIS、apache等web服务器本身就是一个程序,而运行其中的asp、aspx、php、jsp、html等等的单个页面,只不过是帮助web服务器来实现一定功能而已。
  由此可以引申出:我们完全可以用一个aspx页面来处理针对网站的所有动态请求。
  而这个页面,我们就把它起名为index.aspx吧。
  在apache、tomcat等web服务器,都有相应的技术,将网站符合一定规则的所有http请求,都转向一个程序页面(如index.jsp或 index.php)来处理。而IIS在IIS7(前面提到,我们的网站服务器是windows2003,IIS版本为6.0)出来以前,只能借助于第三方组件实现(windows2008的IIS7.0可以不借助第三方组件实现URLRewrite,网上可以找到相关代码)。这其中比较有名的2个是 ISAPI_Rewrite(Full版收费,Lite版免费)和IonicIsapiRewriter(免费),而对于我们这个MVC架构来说,ISAPI_Rewrite Lite版(下载ISAPI_Rewrite Lite,这里有ISAPI_Rewrite Lite的最新版本,我们使用的是ISAPI_Rewrite3_0047_Lite.msi)就足够了,由它来控制请求到我们的 index.aspx(具体代码参见DotNetMVC示例网站代码)。
    (一) 网站的目录结构
  为了使图片、css文件、js文件、html文件等免于ISAPI_Rewrite处理,需在网站根目录建立一个单独的mvc目录,其中存放MVC架构需要的aspx文件,从而网站的目录结构如下:
ROOT
|--App_Code
   |--DotNetMVC
     |--DAL
  |--UserDA.cs
     |--Model
  |--User.cs
     |--Util
  |--ControllerUtil.cs
  |--DBUtil.cs
|--Bin
  |--log4net.dll
|--css
|--images
|--js
|--mvc
  |--application
     |--controllers
  |-default.aspx
  |-user.aspx
     |--views
  |--default
       |-index_view.aspx
  |--share
  |--user
       |-home_view.aspx
       |-list_view.aspx
  |--cache
  |--log
  |-index.aspx
|-Default.aspx
|-Global.asax
|-web.config
  上面的结构中,css、images、js放什么文件分别存放站点用的样式文件、图片文件、javascript脚本文件;Bin存放公共组件(目前有一个日志组件log4net.dll,其配置信息在web.config配置文件中),App_Code存放自定义的公共类,这是.net2.0规定的,mvc目录的作用上面说了,不再赘述。
  下面再看App_Code和mvc下的子目录构成:
   App_Code->Util目录,存放一些实用工具类,目前有2个,DBUtil.cs是SQLServer数据库处理工具类,而 ControllerUtil.cs则是我们这个MVC架构比较核心的URL路由工具类,其中ParseUri方法解析URI返回控制器、控制分支、参数等,LinkTo方法产生需要的网站链接URL(具体代码参见DotNetMVC示例网站代码)。大家还可以在其中添加一些需要的功能,如上传、 Email、字符串、分页、图形处理等。
  而App_Code->DAL和App_Code->Model目录中的内容一起组成 MVC架构中M 层逻辑,其中Model目录的仅仅是数据库表的数据抽象类(这些类可以自己写,也可以通过工具结合数据库表自动生成),DAL目录中的类则通过访问数据库返回数据抽象类的对象实例或实例列表,供控制层调用。
  mvc根目录下的index.aspx文件,如上所述是MVC架构的入口文件。
  mvc->cache和mvc->log目录分别存放缓存文件和日志文件,如果需要的话。
  mvc->application目录中的controllers目录和views目录分别是控制器文件和视图文件,即MVC架构中的C和V层,其中一个控制器对应一个aspx文件(如user.aspx),并在views目录中有一个视图子目录对应(如views->user),其中存放多个此控制器可能用到的视图文件(如home_view.aspx和list_view.aspx等);views->share目录中,则是一些视图文件可能用到的公共文件,如头尾包含页、母板页等。
  (二)MVC运转流程:
  前面曾经提到,要把所有针对本站点的动态请求,都统一到index.aspx这个文件来集中处理,因此需要借助ISAPI_Rewrite,在ISAPI_Rewrite Lite的配置文件httpd.conf(位于ISAPI_Rewrite Lite的安装目录)中增加下面一条记录即可:
RewriteRule /mvc/(.*)$ /mvc/index.aspx/?idu=$1 [NC,NE]
  这条规则是将针对/mvc这个URI及其后的所有访问,都导向到index.aspx这个文件来处理,并将URI路径作为idu参数的值传给index.aspx。
  下面看看index.aspx文件的内容:


<%@ Page Language="C#" %>
<%@ import namespace="System.Threading" %>
<%
string controller;
string method;
string[] parameters;
string uri_string = Request.QueryString["idu"];
DotNetMVC.Util.ControllerUtil.ParseUri(uri_string, out controller, out method, out parameters);
Context.Items.Add("method", method);
Context.Items.Add("parameters", parameters);
string ctlpage = "system/application/controllers/" + controller + ".aspx";
try
{
   Server.Transfer(ctlpage, true);
}
catch (HttpException e)
{
   log4net.LogManager.GetLogger("LogFile").Error("/r/n客户机IP:" + Request.UserHostAddress + "/r/n错误地址:" + Request.Url, e);
}
%>
  


上面代码的关键是,通过对idu值的解析,取得controller、method、parameters这3个参数;其中controller对应于一个控制器文件,method对应控制器中的一个控制分支,parameters则是参数的字符串数组(参数顺序自己把握),其对应URI如下:
/mvc/controller/method/parameter1/parameter2/parameterN
  目前这个MVC架构的URI,都是一个控制器,后跟一个分支,再后跟多个参数,如果没有controller、method、parameters,则默认调用default控制器的index分支,如果没有method、parameters,则默认调用本控制器的index分支;如果以上不满足要求,大家可以自己更改ControllerUtil类的ParseUri方法或者写一个复杂的URL Routing(我个人认为不管什么,够用就好,controller、method已经能够表达复杂的网站层次了)。Server.Transfer方法的第2个参数为true,是确保request、cookie、session等变量能够传递到控制器程序中。
  下面通过default.aspx这个控制器(可以一个功能或一个模块作为一个控制器)说明一下控制器的流程:


<%@ Page Language="C#" %>
<%@ import namespace="DotNetMVC.Util" %>
<%
string method = (string)Context.Items["method"];
string[] parameters = (string[])Context.Items["parameters"];
try
{
if (method == "index")
{
   Context.Items.Add("loginurl", ControllerUtil.LinkTo("user", "login", ""));
   Context.Items.Add("userlisturl", ControllerUtil.LinkTo("user", "list", ""));
   Server.Execute("application/views/default/index_view.aspx");
}
}
catch (HttpException e)
{
log4net.LogManager.GetLogger("LogFile").Error("/r/n客户机IP:" + Request.UserHostAddress + "/r/n错误地址:" + Request.Url, e);
}
%>
  


上面代码中,首先通过Context获取index.aspx中得到的method、parameters参数,然后根据method值的不同,走不同的处理分支(这里可以调用M层获取数据)产生数据并保存在Context(目前仅找到用Context来传递数据到视图)中,再调用不同的视图;这里只有一个默认index分支,去调用首页视图index_view.aspx。
  最后看看views->default目录下index_view.aspx这个视图文件内容:


<%@ Page Language="C#" EnableViewStateMac="false"%>
<%
string loginurl = (string)Context.Items["loginurl"];
string userlisturl = (string)Context.Items["userlisturl"];
%>
<!-- #include file="../share/top.aspx" -->
<center>
<form name=frm1 method=post action=<%=loginurl %>>
昵称:<input type=text name=nick size=20> 
密码:<input type=password name=pass size=20>
<input type=submit value=登陆>  <a href=<%=userlisturl %>>去用户列表</a>
</form>
</center>
<!-- #include file="../share/bottom.aspx" -->
  


这个视图文件中的代码则通过Context接收控制器传过来的数据并显示它。
  至此,整个MVC的运转流程就完成了;其他更复杂的一些操作,大家可以参照DotNetMVC示例网站代码,相信根据这个示例,就可以直接建立并快速开发自己的MVC网站了,并有URL重写功能;在其中的user控制器及视图中,大家可以看到这种编程有一个好处,那就是可以充分利用visual studio的代码智能感知功能。
  不过,有一点需要大家注意,因为需要经过ISAPI_Rewrite过滤器与Transfer、 Execute处理,所以会有一些性能损失。根据流程的复杂程度,其损失所占比重会有所不同:越复杂的流程,其损失所占比重越小,越简单的流程,其损失所占比重越大;所以大家在用这套流程开发网站时,应充分注意这一点,并适当进行程序优化,或者干脆别用它了。
   二、MV编程:
  大家在看上面的DotNetMVC示例网站代码的时候,肯定有一个感觉:在控制层产生数据,要赋给Context,视图层再从Context中取出数据来显示,似乎多此一举;所以引出下面的MV编程(可能会丧失一些灵活性和可维护性,但开发一般的网站应该足够了)。
  我们只需要把DotNetMVC示例网站代码中的代码简单做一下修改就可以了。
  首先,修改index.aspx如下:


<%@ Page Language="C#" %>
<%@ import namespace="System.Threading" %>
<%
string controller;
string method;
string[] parameters;
string uri_string = Request.QueryString["idu"];
DotNetMVC.Util.ControllerUtil.ParseUri(uri_string, out controller, out method, out parameters);
Context.Items.Add("method", method);
Context.Items.Add("parameters", parameters);
string ctlpage = "application/views/" + controller + "/" + method + ".aspx";
try
{
   //Server.Transfer(ctlpage, true);
   Server.Execute(ctlpage);
}
catch (HttpException e)
{
   log4net.LogManager.GetLogger("LogFile").Error("/r/n客户机IP:" + Request.UserHostAddress + "/r/n错误地址:" + Request.Url, e);
}
%>


这里直接用controller和method组合出视图路径,并用Server.Execute去执行它(因为Server.Transfer总是抛出 System.Threading.ThreadAbortException异常,虽然不影响运行,这似乎是asp.net的一个小问题)。
  然后删除控制器目录的内容,并将控制器页面中的代码转移到视图中即可,具体请参看DotNetMV示例网站代码。这样,既减少了编程复杂度,又增加的开发效率和运行性能,同时URL重写和代码智能感知等优点仍然得以保留。
  附:51aspx.com
  下载DotNetMVC示例网站代码和DotNetMV示例网站代码到本地后,请注意示例网站代码是一个完整的网站架构,大家可以直接在VS中建立一个新网站(VS2005和VS2008),清空VS自动产生的内容,然后将代码拷入即可,根据实际修改web.config文件;运行调试前,请先安装 ISAPI_RewriteLite(下载ISAPI_Rewrite Lite),并修改其配置文件;调试时,请注意修改站点的“启动选项”使用本地IIS,因为VS中的DevelopWebServer无法加载 ISAPI_Rewrite过滤器。51aspx
  另外,测试数据表建立脚本给出如下:

CREATE TABLE [dbo].[users](
[id] [int] IDENTITY(1,1) NOT NULL,
[nick] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[pass] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL,
[reg_date] [datetime] NULL CONSTRAINT [DF_test_inputdate] DEFAULT (getdate())
) ON [PRIMARY]
飞书云文档API操作详细介绍 开通云文档API、python程序调用飞书api、飞书获取app_id和app_secret、 阅读详情

相关推荐

在Ubuntu上通过Wine完美运行企业微信的详细指南

本文提供了在Ubuntu系统上通过Wine兼容层安装和运行企业微信的详细教程。针对官方未提供Linux版本的痛点,指南推荐使用Ubuntu Kylin团队优化打包的Wine环境,通过简单的命令行步骤即可完成部署,并涵盖启动、中文输入法配置、文件管理等常见问题的解决方案,帮助用户实现高效、稳定的办公沟通。

weixin_29306317的博客 233

紫光同创PGL22G开发板DDR3 IP核配置与AXI4协议实战

DDR3控制器作为FPGA高速存储接口的核心组件,其IP核配置与总线协议理解是嵌入式系统设计的关键环节。基于AXI4总线协议的存储控制器通过突发传输机制实现高效数据传输,在视频处理、高速数据采集等场景具有重要应用价值。紫光同创PGL22G开发板搭载的DDR3 IP核采用独特的时钟架构设计,需要特别注意AXI4接口配置与时序约束。本文通过Verilog代码实例演示了如何实现DDR3读写操作,并针对MT41J128M16HA-125等常见DDR3颗粒提供了优化建议,包括突发长度设置、地址对齐等工程实践技巧,帮助

weixin_33672400的博客 440

微信小程序真机HTTPS证书链失效排查与修复指南

HTTPS证书信任链是保障Web通信安全的基础机制,其核心在于客户端能否通过服务器提供的证书及其上级签发者,逐级回溯至自身预置的可信根证书。在微信小程序场景中,由于客户端不复用系统根证书库,而是采用固化、精简且更新滞后的自研CA白名单,导致大量符合浏览器标准的证书(如Let’s Encrypt新版ISRG Root X1、TrustAsia等)在真机环境下触发net::ERR_CERT_AUTHORITY_INVALID错误。该问题本质是证书链断裂或签名算法/密钥长度不合规,而非域名配置或CORS策略异常。

weixin_33935636的博客 681

setValueForKey方法重写

1284

黑客渗透测试后门隐藏技术揭秘

本文介绍了在授权渗透测试中隐藏后门文件(muma.exe)的多种技术手段。主要包括:通过WinRAR自解压脚本将后门与正常程序捆绑实现双开;利用系统自动运行目录和注册表实现开机自启;修改文件图标伪装成常用软件;将文件存放在冷门系统目录;设置系统+隐藏双重属性增强隐蔽性。此外还涉及对抗安全软件的加壳(UPX)、免杀(msfvenom编码)技术,以及进程注入、日志清除等运行隐藏方法。所有技术仅限合法授权测试使用,未经授权使用将面临法律责任。

m0_60781580的博客 1040

AI大模型学习(13)小白也能学会的10分钟豆包大模型的python教程1

豆包AI大模型API是字节跳动推出的智能对话接口服务,开发者可以通过简单的HTTP请求调用强大的AI能力,实现智能问答、内容生成等功能。

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1002

重写UICollectoinViewFlowLayout需要重写的方法

501

FFmpeg实战:5分钟搞定m3u8视频下载与ts文件合并(附完整命令)

本文详细介绍了如何使用FFmpeg快速下载m3u8视频并合并ts文件为mp4格式。通过简洁的命令行操作,读者可以轻松完成视频处理任务,包括环境准备、链接获取、下载合并及性能优化等实用技巧,特别适合需要高效处理流媒体内容的用户。

weixin_30836759的博客 221

asp.net的MVC编程、URL重写以及MV编程

asp.net的MVC编程、URL重写以及MV编程前一段时间做一个网站项目,使用win2003+.net2.0开发;在学习了一些.net的相关知识后,并考虑到此项目需要多人合作,以及架构清晰、URL重写等优点,决定用MVC方式开发。但微软的asp.netMVC框架据说要下半年才出正式版,而且还需要.net3.5,其他的MVC框架又不熟悉,估计也需要一段时间学习。由于开发时间比较紧,我们

Zfrong繁荣的IT技术、IT项目、解决方案专栏Blog-上海 791

SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2))

创建订单样例代码参见:http://blog.csdn.net/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010

SAP BLOG--Jack Wu 6226

[网络安全提高篇] 一一九.恶意软件动态分析经典沙箱Cape的安装和基础用法详解

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文详细介绍恶意代码静态分析经典工具Capa的基础用法,以及批量提取静态特征和ATT&CK技战术,主要是从提取的静态特征Json文件中提取关键特征。这篇文章将详细讲解动态分析沙箱Cape,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。本文先介绍Cape沙箱的安装和基础用法,后续随着深入再分享。基础性文章,希望对您有帮助!

杨秀璋的专栏 1万+

asp.net的MVC编程、MV编程以及URL重写

前一段时间做一个网站项目,使用win2003+.net2.0开发;在学习了一些.net的相关知识后,并考虑到此项目需要多人合作,以及架构清晰、 URL重写等优点,决定用MVC方式开发。但微软的asp.net MVC框架据说要下半年才出正式版,而且还需要.net3.5,其他的MVC框架又不熟悉,估计也需要一段时间学习。由于开发时间比较紧,我们开发小组中也没有一个对asp.net及asp.net MV

yyoanlp的专栏 748

【人工智能】OpenClaw网关API速率限制报错全解析 API rate limit reached. Please try again later.

对应HTTP标准状态码为429(请求过多)。该报错集中出现在OpenClaw GATEWAY DASHBOARD的聊天会话界面,核心特征为:用户最初以为是单一模型服务商的问题,先后更换OpenAI、Gemini、Ollama、Moonshot、Mercury-2等多个主流大模型API后,该报错仍稳定触发,尤其在执行复杂任务时高频出现。

奶爸的编程之路,也就一周冷个三天 6459

ASP.NET MVC URL 路由简介

URL 路由简介在本教程中,将介绍对于每个 ASP.NET MVC 应用程序都非常重要的 URL 路由功能。URL 路由模型负责将进入的浏览器请求映射到特定的 MVC 控制器操作。在本教程的第一部分中,我们将学习标准路由表如何将请求映射到控制器操作。在本教程的第二部分中,我们将学习如何使用自定义路由修改默认的路由表。使用默认路由表在创建新的 ASP.NET MVC 应用程序时,应用

deng_zz的专栏 5234

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

asp.net mvc重写url地址

using System; using System.Collections.Generic; using System.Linq; using System.Security.Principal; using System.Web; using System.Web.Mvc; using System.Web.Routing; using WebGrease.Css.Ast; namespace WebApplicationUrlWrite { public class RouteConfig.

u011511086的专栏 716

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

自学MVC看这里——全网最全ASP.NET MVC 教程汇总

MVC架构已深得人心,微软也不甘落后,推出了ASP.NET MVC。小编特意整理博客园乃至整个网络最具价值的MVC技术原创文章,为想要学习ASP.NET MVC技术的学习者提供一个整合学习入口。本文从Why,What,How三个角度整理MVC 的学习资源,让学习者第一时间找到最有价值的文章,获取最彻底的ASP.NET MVC 框架知识。与此同时,小编也推荐一款轻量级控件Compone...

3171

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MVC 路由URL重写

在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量。   URL重写与优化就是搜索引擎优化的手段之一。   假如某手机网站(基于ASP.NET MVC)分类页面URL是这样的,   http://www.xxx.com/category/showcategory?categoryid=1000&view=list&amp...

diansui2286的博客 288

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL

ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL引言--  在初级篇中,我们介绍了如何利用基于ASP.NET MVC的Web程序中的Global文件来简单的重写路由。也介绍了它本身的局限性-依赖于路由信息中的键值对:  如果键值对中没有的值,我们无法将其利用凑出我们想要的URL表达式。  初级篇传送门:使用Global路由表定制URL   在进阶篇中,我们将介绍

SalmonellaVaccine的专栏 1050

在不同版本的IIS下使用ASP.NET MVC和URL Routing

(原创:灰灰虫的家 http://hi.baidu.com/grayworm)在这篇文章中我们学习在不同版本的IIS中使用ASP.NET MVC和URL Routing。我们学习针对IIS7.0、IIS6.0和更早版本的IIS的处理策略ASP.NET MVC框架依赖于URL Routing,要充分利用URL Routing,我们需要对Web服务器(IIS)进行一些额外的配置。IIS的最新版本是

ITbird的专栏 5886

ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

ASP.NET MVC 一、获取URL(ASP.NET通用): 【1】获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); 【2】获取虚拟目录名+页面名+参数: string url=Request.RawUrl;(或 string url=Request.Url.PathAndQu...

816

Scott的ASP.net MVC框架系列文章之二: URL映射

[原文地址][查看该系列的其他文章]上个月我发表了介绍ASP.net MVC框架系列文章的第一篇,介绍了一个具有产品列表/浏览功能的简单的电子商务网站,包含了MVC背后的高级概念,并演示了从零开始实现如何创建一个ASP.net MVC项目并测试了电子商务网站的产品列表功能。在今天的这篇文章里我将要深入介绍ASP.net MVC框架中的URL映射架构,并讨论如何在你的应用程序里里用这种方式进

drummery的专栏 3827

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

引言---   在现今搜索引擎制霸天下的时代,我们不得不做一些东西来讨好爬虫,进而提示网站的排名来博得一个看得过去的流量。   URL重写与优化就是搜索引擎优化的手段之一。   假如某手机网站(基于ASP.NET MVC)分类页面URL是这样的,   http://www.xxx.com/category/showcategory?categoryid=1000&view...

diaoqin4202的博客 299

asp.net mvc css url

asp.net mvc4 的 cshtml文件中支持 虚拟路径的语法,如 Home         但是,css 文件中不支持这种语法,比如这样的文件结构: Project ----Content --------images ------------ok.png --------Site.css          如果我在Site.css文件中这样引用图片ok.png是不行的 #

食食物者,为俊杰 2559
上一篇: HTTP协议中GET、POST和HEAD的介绍
下一篇: mysql 错误日志
kong佳
博客等级 码龄23年 9粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值