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 ...
随机推荐
- codeforces 360 D - Remainders Game
D - Remainders Game Description Today Pari and Arya are playing a game called Remainders. Pari choos ...
- js二进制与十进制互转
十进制转换为二进制: var num = 100; console.log(num.toString(2)); toString()方法可把一个 Number 对象转换为一个字符串,并返回结果. 语法 ...
- c#List移除列表中的元素
对于一个List<T>对象来说移除其中的元素是常用的功能.自己总结了一下,列出自己所知的几种方法. class Program { static void Main(string[] ar ...
- Stanford Prof. Li Feifei写给她学生的一封信
De-mystifying Good Research and Good Papers By Fei-Fei Li, 2009.03.01 Please remember this: 1000+ co ...
- 关于ReSharper
Resharper提供以下6个核心功能1. 代码分析(Code Analysis):智能提示代码中存在的问题和修复建议. 2. 编码助手(Coding Assistance):智能提示自动完成功能. ...
- http长轮询&短轮询
http 协议介绍: http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的. http ...
- XCod5 SVN
近日开始学习IOS开发, 涉及版本管理问题,老大说要使用SVN, 在Windows系统中使用SVN的经验使得俺以为需要首先安装SVN,然后再配置等等, 殊不知XCode5中已经内置了SVN, 在百度一 ...
- WPF之命令浅谈
一.认识命令 1.1命令的特点 提到“命令”,我们应该想到命令的发出者,命令的接受者,命令的内容,准备工作,完成任务,回报工作...与事件中的发送者,接受者,消息,处理,处理,处理一一对应,如果是单纯 ...
- Git ignore UserInterfaceState.xcuserstate
1. 退出xcdoe, 打开终端(Terminal),进入到你的项目目录下 2. 在终端键入 git rm --cached [YourProjectName].xcodeproj/project. ...
- 解读2015年互联网UGC内容发展态势,安全事件频发
<2015内容安全年报> 阿里移动安全 第一章 2015年内容安全形势 随着互联网业务的迅速发展,互联网上的信息内容带来了爆炸式的增长.由于缺乏对网络活动进行有效监督和管理的措施,致使互联 ...