ASP.NET MVC 混搭 ASP.NET WebForms 所导致的 Html.ActionLink/BeginForm 问题
首先,需要了解下这篇博文:《ASP.NET WebForms MapPageRoute 路由配置》
之前,在 ASP.NET MVC 中混搭 ASP.NET WebForms,使用 MapPageRoute 没有出现什么问题,但是今天在测试一个表单提交的时候,却莫名其妙的出现一个诡异的问题,我先大致描述下,就是 MVC View 中使用表单,Html.BeginForm 方法提交到指定控制器的 Action 中进行处理,大致代码为:
@using (Html.BeginForm("ProfileSubmit", "Set", FormMethod.Post, new { id = "myform" }))
{
@Html.AntiForgeryToken()
<table class="info_block" cellpadding="0" cellspacing="0">
<tr>
<td class="tr_title">
姓名:
</td>
<td class="tr_content">
@Html.TextBoxFor(n => n.RealName, new { id = "txt_name", @class = "tb_m" })
</td>
</tr>
</table>
<div class="save_block">
<input type="submit" class="btn_blue" name="btnSubmit" value="保存" onclick="return UpdateProfile();" id="btn_submit">
<div class="text_red" style="height: 3em; line-height: 3em;">
<span id="lit_tip">@Model.Message</span>
</div>
</div>
}
这是我们最普遍的写法,把表单数据提交到 Set 控制器的 ProfileSubmit Action 中进行处理,但是在提交的时候,URL 却变成了:
http://home.cnblogs.com/job/myresume?action=ProfileSubmit&controller=Set
是不是很诡异?我明明在 Html.BeginForm 方法中指定了 Controller 和 Action,为什么没有起作用,反而跳转到了一个莫名其妙的 URL,根据 URL,我就查看了下路由配置,发现下面的一段配置:
routes.MapPageRoute("JobMyResume",
"job/myresume",
"~/old/job/MyResume.aspx"
);
注意,这段路由配置并不是使用的 MapRoute,而是 MapPageRoute,是配置 ASP.NET WebForms 路由的,我把这段配置注释掉,然后就可以了,有点莫名其妙,为什么使用 Html.BeginForm 会映射到这段路由上?最后搜了大量的资料,也没有找到相关说明,我个人觉得是 MapPageRoute 的问题,ASP.NET MVC 混搭 ASP.NET WebForms,但是在 URL 请求处理的时候,并不是很准确,凡事使用 Html Helps 里面的生成 URL 方法,都存在问题,除了 Html.BeginForm,还有我们常用到的 Html.ActionLink,但是从外部客户端进入的请求,就没有任何问题,最后找了一些相关解决方式,也证明了这一点,解决方式很简单,先添加如下代码:
public class IncomingRequestConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return routeDirection == RouteDirection.IncomingRequest;
}
}
然后 MapPageRoute 的路由配置改为:
routes.MapPageRoute("JobMyResume",
"job/myresume",
"~/old/job/MyResume.aspx", false, null, new RouteValueDictionary(new
{
controller = new IncomingRequestConstraint()
})
);
什么意思呢?RouteDirection.IncomingRequest 的意思,就是路由约束限制在外部,也就是说只请求来自客户端的 URL,内部的 URL 不匹配此路由,像 Html.ActionLink/BeginForm 是 MVC 内部生成的 URL,所以是不被匹配的,RouteDirection 还有另外一个枚举值 UrlGeneration,它的意思就是只请求内部生成的 URL。
上面这种解决方案,只是临时的解决方案,也就是像打补丁一样的处理方式,关于为什么会出现这个问题?MapPageRoute 具体是怎么进行配置的?ASP.NET MVC 混搭 ASP.NET WebForms 请求到底是怎么处理的?这些还不是很清楚,希望大家可以指教。
- RouteDirection Enumeration
- Why does the order of route mapping matter when mixing MVC and webforms?
- Unexpected form url with mixed aspx & controller MVC .Net routes
- Combining ASP.NET WebForms and ASP.NET MVC
ASP.NET MVC 混搭 ASP.NET WebForms 所导致的 Html.ActionLink/BeginForm 问题的更多相关文章
- ASP.NET MVC中加载WebForms用户控件(.ascx)
原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理
第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...
- 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性
[索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...
- 既生瑜何生亮?ASP.NET MVC VS ASP.NET Web API
Asp.net MVC 与 Asp.net Web API 区别 在我们开发一些web应用时,我们一样可以在MVC Framework 中使用JsonResult 来返回JSON数据,同样也可以处理一 ...
- MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务
ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...
- asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api 注册全局异常过滤器的不同之处 using SuperManCore; using System. ...
- 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller
原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...
- 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model
原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...
随机推荐
- JAVA回调机制和观察者模式实例分享
回调函数在JAVA中使用频繁,比如Swing可视化编码中的监听事件等等,一般回调函数都是,通过某一个方法的执行,自动调用回调对象的回调方法,比如,有一个接口,里面有一个方法onNotify(),这个方 ...
- mac和virtualbox虚拟机共享
virtualbox安装增强工具 打开虚拟机,devices—shared folders—settings 打开窗口,选择“共享文件夹”,点击“带加号的文件夹图标”, 点击文件夹路径,选择其它,然后 ...
- QComboBox的activated与currentIndexChanged的区别
void activated ( int index ) void activated ( const QString & text ) 信号activated是只要单击选择框即使所选内容选择 ...
- HttpFox
HttpFox是Firefox的插件,可以用于HTTP分析. https://addons.mozilla.org/en-US/firefox/addon/httpfox/ 安装 1. 打开F ...
- JAligner的一个坑
JAligner是一个集成多个罚分矩阵的蛋白质序列比对工具包,提供充足的API供开发人员调用. 但是,不可否认的是,它的结构写得不够规范.以前我是将它放在普通的Java项目里使用,没有问题.但是,今天 ...
- tomcat context配置
<Context path="/ext" docBase="/eqp/export" /> 访问目录 ...
- pythonchallenge 解谜 Level 8
#-*- coding:utf-8 -*- #代码版本均为python 3.5.1 #Level 7 import bz2 un=b'BZh91AY&SYA\xaf\x82\r\x00\x00 ...
- SQL初步知识点
varchar(n) 长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节. nva ...
- C# 6.0 功能预览 (一)
一.索引的成员和元素初始化 1.1 原始初始化集合 Dictionary 1.2 键值初始化集合 Dictionary 1.3 运算符 $ 初始化集合 Dictionary 二.自动属性的初始化 一不 ...
- 我只是想开个饭店—— JavaIO模型的演变
Java的IO...真的是我所见过的高级语言中.最最复杂的... 看着这个图我也是醉了. 但是不知不觉间,java的IO已经更新到了NIO.2了,IO库早已经不止是这个样子了,那么这个过程中,它们经历 ...