zoukankan      html  css  js  c++  java
  • 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 请求到底是怎么处理的?这些还不是很清楚,希望大家可以指教。

  • 相关阅读:
    基于WS流的RTSP监控,H5低延时,Web无插件,手机,微信ONVIF操控摄像头方案
    H5微信视频,直播低延时,IOS限制全屏播放,自动播放问题处理。
    最新IOS,safari11中对webrtc支持,IOS和android视频聊天,web低延时视频教学技术分析
    MySql 用户篇
    Sql Server 数据库帮助类
    [C#基础知识]转载 private、protected、public和internal的区别
    Mysql 插入语句
    .net core identityserver4 学习日志
    mysql 事务模板
    .net core 生成二维码
  • 原文地址:https://www.cnblogs.com/xishuai/p/aspnet-webforms-and-mvc-mappageroute-html-actionlink-beginform.html
Copyright © 2011-2022 走看看