asp.net-mvc-3 - Wcf Web Api 服务路由与常规 asp.net mvc 路由冲突(Web api 预览版 4)

标签 asp.net-mvc-3 wcf-web-api

我注意到我的 mvc 应用程序在使用时创建了错误的 url:

@using (Html.BeginForm("Test", "Test"))
{
    <input type="submit" value="Submit" />
}

这是生成的html源代码:

<form action="/books?action=Test&amp;controller=Test" method="post">

请注意,操作以 /books 开头。这是错误的!

我注意到 Html.BeginForm 始终包含已在 MapServiceRoute 中注册的第一个 Web api 的开头。 (见下面的代码)

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    var builder = HttpHostConfiguration.Create();
    routes.MapServiceRoute<BooksService>("books", builder);

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );
}

我花了很长时间试图弄清楚为什么我的应用程序中的网址被破坏,但一无所获。 然后我决定使用一个极其简单的 mvc 应用程序进行测试,果然问题可以很容易地重现。 我测试的 mvc 应用程序非常简单,是由 asp mvp 创建的。可以找到here 。我所做的只是添加 TestController 和 Views/Test/Index.cshtml View 。在 View 中,我添加了上面所示的 Html.BeginForm。如果您启动应用程序并访问测试 Controller ,只需将鼠标悬停在提交按钮上(或查看 html 源代码),您就会发现 url 是错误的。

有人知道如何避免这个问题吗?

编辑: 这适用于 Web API 预览版 4(2011 年 4 月)。

最佳答案

另一种方法是定义路由约束:

public class WcfRoutesConstraint : IRouteConstraint {
    public WcfRoutesConstraint(params string[] values) {
        this._values = values;
    }

    private string[] _values;

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
RouteValueDictionary values, RouteDirection routeDirection) {

    // Get the value called "parameterName" from the
    // RouteValueDictionary called "value"
    string value = values[parameterName].ToString();

    // Return true is the list of allowed values contains
    // this value.
    bool match = !_values.Contains(value);
    return match;
    }
}

将约束分配给 MVC 路由

routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
        new { controller = new WcfRoutesConstraint(new string[] {"contact","login"}) }
    );

这可以防止 MVC 接触 URL“/login”和“/contact”

关于asp.net-mvc-3 - Wcf Web Api 服务路由与常规 asp.net mvc 路由冲突(Web api 预览版 4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7225887/

相关文章:

asp.net-mvc - 删除@Html.TextArea的文本onclick/onfocus事件

wcf - 如何将WCF异常传达给WebClient

asp.net-mvc - 我可以在同一个 AppHarbor 站点上运行 MVC 应用程序和 WCF Web Api 吗?

unit-testing - 如何使用最小起订量生成虚假数据进行单元测试?

razor - 我应该在 ASP.NET MVC 3 中放置声明性 HTML 助手

c# - 我应该如何在 Web API Controller 方法中返回数据?

wcf - 如何使用 WCF WebApi 的 HttpClient 发布 POCO

wcf - 用于 .NET 框架 3.5 的 WebApi HttpClient

asp.net-mvc-3 - 何时使用 ViewModel 何时不在 Asp.net MVC 中

c# - 什么是锁定线程的正确方法?