我注意到我的mvc应用在使用时创建了错误的网址:
@using (Html.BeginForm("Test", "Test"))
{
<input type="submit" value="Submit" />
}
这是生成的html源代码:
<form action="/books?action=Test&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视图。在视图中,我添加了上面显示的Html.BeginForm。如果您启动应用程序并访问测试控制器,只需将鼠标悬停在提交按钮上(或查看html源代码),即可看到网址错误。
任何人都知道如何避免这个问题?
修改: 这适用于web api预览4(2011年4月)。
答案 0 :(得分:4)
找到答案。这是一个众所周知的问题。 Glenn Block发布了一个解决方法。 我刚刚测试过,这确实解决了这个问题。 它将在下一次下降时修复。
http://codebetter.com/glennblock/2011/08/05/integrating-mvc-routes-and-web-api-routes-2/
答案 1 :(得分: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触及Urls“/ login”和“/ contact”
答案 2 :(得分:0)
在我们的protoype分支的下一篇文章中,我们included一个WebApiRoute来解决这个问题(使用我在博文中提到的方法)。 MapServiceRoute使用它。