我有一个我通过RedirectToRoute调用的路由,如下所示:
return this.RedirectToRoute("Super-SuperRoute", new { year = selectedYear });
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
return this.RedirectToRoute("Super-SuperRoute", new { controller = "Super", action = "SuperRoute", id = "RouteTopic", year = selectedYear });
Run Code Online (Sandbox Code Playgroud)
global.asax中的路由是这样的:
routes.MapRoute(
"Super-SuperRoute", // Route name
"Super.mvc/SuperRoute/{year}", // URL with parameters
new { controller = "Super", action = "SuperRoute", id = "RouteTopic" } // Parameter defaults
);
Run Code Online (Sandbox Code Playgroud)
那么为什么我会收到错误:"路由表中没有路由与提供的值匹配."?
我看到selectedYear的类型是var.当我尝试使用int.Parse转换为int时,我意识到selectedYear实际上是null,这可以解释问题.我想下次我会更加注意断点处变量的值:)
我想用ASP.NET MVC组建一个论坛/留言板.在这些类型的论坛上很常见的是分层板类别,例如:
-
一般性讨论
-
技术支持
- 网站技术支持
- 产品技术支持---产品A技术支持
---产品B技术支持
然后,每个类别下面的主题和消息属于这些主题.我主要关注的是1.)到达正确的位置,给定URL,2.)不包括我的URL中的大量不必要的信息,以及3.)能够从代码重新创建URL.
我想要一个像这样的URL:
mysite.com/Forum/ - forum index mysite.com/Forum/General-Discussion/ - board index of "general discussion" mysite.com/Forum/Technical-Support/Product/Product-A/ - board index of "Product A Tech Support" mysite.com/Forum/Technical-Support/Website/Topic1004/ - Topic index of topic with ID 1004 in the "Website Technical Support" board mysite.com/Forum/Technical-Support/Website/Topic1004/3 - Page 3 of Topic with ID 1004
现在,我已经从中排除了动作名称,因为它们可以根据我的位置来推断.我的数据库中的每个Board实体都有一个"UrlPart"列,该列已编入索引,因此我希望能够对该表执行相对快速的查询以确定我的位置.
问题是:为了找出正确的位置,我应该使用自定义路由处理程序,自定义路由绑定器,还是应该创建模糊的路由规则?
这个建议看起来很不错,但它看起来好像很多工作没有什么好处: 用于搜索的ASP.NET MVC自定义路由
这似乎表明创建模型绑定会更容易: MVC Dynamic Routes
为了实现#3,我将不得不创建自己的自定义URL生成逻辑,对吧?
在强类型视图上使用内置验证助手实现错误处理时,通常在控制器中创建一个try/catch块,并返回一个视图,其中相应的模型作为View()方法的参数:
控制器
public class MessageController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Models.Entities.Message message)
{
try
{
// Insert model into database
var dc = new DataContext();
dc.Messages.InsertOnSubmit(message);
dc.SubmitChanges();
return RedirectToAction("List");
}
catch
{
/* If insert fails, return a view with it's corresponding model to
enable validation helpers */
return View(message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
风景
<%@ Page
Language="C#"
Inherits="System.Web.Mvc.ViewPage<Models.Entities.Message>" %>
<%= Html.ValidationSummary("Fill out fields marked with *") %>
<% using (Html.BeginForm()) { %>
<div><%= Html.TextBox("MessageText") %></div>
<div><%= Html.ValidationMessage("MessageText", …Run Code Online (Sandbox Code Playgroud) 我正在研究一个新项目的概念,我需要支持多语言URL.理想情况下,所有URL都需要使用用户的本地语言.因此,我们不想使用domain.com/en/contact和domain.com/es/contact,但我们喜欢domain.com/contact和domain.com/contactar(contactar是西班牙语以便联系).在内部,两者都应该路由到同一个ContactController类.
这可以通过为每种语言添加到Global.asax.cs的多个静态路由来处理,但我们希望使其非常动态,并希望系统用户能够通过内容管理更改URL的转换系统.所以我们需要从URL到控制器和动作的某种动态映射.
通过查看MVC3的源代码,我发现MvcHandler的ProcessRequestInit方法负责确定要创建哪个控制器.它只是在RouteData中查找控制器的名称.覆盖默认MVC路由的一种方法是创建使用自定义RouteHandler的简单默认路由.此RouteHandler强制MVC使用我自己的自定义子类MvcHandler,它会覆盖ProcessRequestInit方法.在重新调用原始ProcessRequestInit之前,此重写方法将我自己动态找到的控制器和操作插入到RouteData中.
我试过这个:
的Global.asax.cs
routes.Add(
new Route("{*url}", new MultilingualRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Default", action = "Default" })
}
);
Run Code Online (Sandbox Code Playgroud)
MultilingualRouteHandler.cs
public class MultilingualRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MultilingualMVCHandler(requestContext);
}
}
Run Code Online (Sandbox Code Playgroud)
MultilingualMvcHandler.cs
public class MultilingualMVCHandler : MvcHandler
{
public MultilingualMVCHandler(RequestContext context) …Run Code Online (Sandbox Code Playgroud) 我最近采用了一个已经升级到.NET 4的现有ASP.NET 3.5 Web表单应用程序(并且运行良好),并将其配置为运行ASP.NET MVC3,遵循Scott Hanselman的博客文章:集成ASP.NET MVC 3进入现有升级的ASP.NET 4 Web Forms应用程序.它运作良好,我已成功开始基于Razor引入视图,现有aspx页面继续工作.
然而,停止工作的一件事是自定义HttpHandler(我们的负载均衡器命中特定地址以确保应用程序可用 - 处理程序用于该地址).web.config总是在如下的system.web部分中声明处理程序:
<httpHandlers>
<add verb="*" path="system/heartbeat.aspx"
type="My.Monitor.HttpHandlers.LoadBalancerHandler, My.Monitor"/>
</httpHandlers>
Run Code Online (Sandbox Code Playgroud)
现在我们正在测试post-MVC3,我得到的异常是:
未找到路径'/system/heartbeat.aspx'的控制器或未实现IController.
我RegisterRoutes在我的方法中定义了一个方法,Global.asax并从中调用该方法Application_Start.在RegisterRoutes我已经得到了IgnoreRoute从Hanselman的博客的声明:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)
我认为这是为了防止路由系统采用扩展名为.aspx的任何东西.
我可以在调试时在VS2010中重现该问题,并且部署环境正在运行IIS 6.
我该怎么做才能阻止路由系统尝试处理该地址,以便自定义处理程序可以做到这一点?任何帮助表示赞赏.
asp.net asp.net-mvc httphandler asp.net-mvc-routing asp.net-mvc-3
我正在尝试使用新的ASP.NET Web API执行以下操作:
/api/business/{id}获取业务目录信息的GET .对同一URL的PUT更新信息等.该部分工作正常.当我想要添加以前曾经是一个动作的内容时,我遇到的问题就是查看该业务的评论.理想情况下,我希望在/api/business/{id}/reviewsGET返回评论,POST提交新评论等等时可以访问.
在普通的ASP.NET MVC应用程序中,我可以定义两个操作方法(Review和PostReview),然后使用属性来更改操作名称并接受第二个函数的HTTP方法.我希望有一些方法可以在新系统中使用类,但我无法弄清楚它是什么,我在文档中没有看到任何关于这个问题的内容.
使用领域也没有工作,尽我可以告诉:我需要的/business/{id}URL的工作,并打破区域.
我有以下控制器方法:
public ActionResult GetResults(string viewToReturn, int resultsPerPage,
string classification = null, string sessionId = null, int? lastId= null)
{
...
}
Run Code Online (Sandbox Code Playgroud)
通过以下url调用上面的方法:
http://localhost:63455/Home/GetResults?viewToReturn=grid&resultsPerPage=30
Run Code Online (Sandbox Code Playgroud)
导致此消息抛出异常:
在控制器'MyWebSite.Controllers.HomeController'上找不到公共操作方法'GetResults'.
这里是RegisterRoutes:
......
routes.MapRoute("Home", "home/{action}/{*qualifier}",
new { controller = "Home", action = "Index", qualifier = UrlParameter.Optional });
......
routes.MapRoute("SearchTitle", "{*path}",
new { controller = "Home", action = "SearchTitle", path = UrlParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误,如何解决?谢谢!
我正在我的Web API帮助页面中呈现重复条目,其中包含不同的父级,例如这些,引用相同的方法:
GET api/{apiVersion}/v1/Products - 获取所有产品
...
GET api/v1/Products - 获取所有产品
...
我有一个Web API页面,其中包含一些这样的路由:
config.Routes.MapHttpRoute (
name: "DefaultVersionApi",
routeTemplate: "api/{apiVersion}/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute (
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
我原以为这个路由会使"v1"成为可选项,所以上面的派生文档是不可取的.
(侧边栏:api/products肯定不行,所以我不确定这有什么问题.我错过了什么?)
看起来真正的问题是Web API帮助页面正在不正确地读取路由,正如我想的那样v1,{apiVersion} 不应该同时出现在同一个动作中. 我在这里错过了什么?
asp.net-mvc-routing asp.net-web-api asp.net-web-api-helppages
我有一个Api控制器,它有两个不同的动作,它们采用不同的参数类型.
// GET: users/sample%40email.com
[Route("users/{emailAddress}")]
public IHttpActionResult GetUser(string emailAddress)
// GET: users/1D8F6B90-9BD9-4CDD-BABB-372242AD9960
[Route("users/{reference}")]
public IHttpActionResult GetUserByReference(Guid reference)
Run Code Online (Sandbox Code Playgroud)
问题是当我向其中任何一个发出请求时发现匹配的多个操作.看看其他答案,我认为我需要在WebApiConfig中设置路线,就像这样......
config.Routes.MapHttpRoute(
name: "apiEmail",
routeTemplate: "api/{controller}/{action}/{email}"
);
config.Routes.MapHttpRoute(
name: "apiReference",
routeTemplate: "api/{controller}/{action}/{reference}"
);
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能根据我传入的参数类型调用每个动作?
我对Web很新.任何其他解释文本都会受到赞赏.
asp.net-mvc-routing asp.net-web-api asp.net-web-api-routing asp.net-mvc-5
我是否需要在ASP.NET Core 1.0应用程序中配置任何使用属性路由的东西?
以下似乎对我不起作用.当我去localhost:132/accounts/welcome时,我期待这个方法
public class AccountsController : Controller
{
[Route("welcome")]
public IActionResult DoSomething()
{
return View();
}
}
Run Code Online (Sandbox Code Playgroud) asp.net-mvc-routing attributerouting asp.net-core asp.net-core-1.0