标签: asp.net-mvc-routing

MVC预览4 - 路由表中的路由与提供的值不匹配

我有一个我通过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 asp.net-mvc-routing

4
推荐指数
1
解决办法
2909
查看次数

具有任意深度的ASP.NET MVC动态路由和动作链接

我想用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生成逻辑,对吧?

c# asp.net-mvc asp.net-mvc-routing

4
推荐指数
1
解决办法
4890
查看次数

从ActionFilterAttribute返回带有它的模型的视图

在强类型视图上使用内置验证助手实现错误处理时,通常在控制器中创建一个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)

c# asp.net-mvc asp.net-mvc-routing

4
推荐指数
1
解决办法
6129
查看次数

使用ASP.NET MVC的多语言URL

我正在研究一个新项目的概念,我需要支持多语言URL.理想情况下,所有URL都需要使用用户的本地语言.因此,我们不想使用domain.com/en/contactdomain.com/es/contact,但我们喜欢domain.com/contactdomain.com/contactar(contactar是西班牙语以便联系).在内部,两者都应该路由到同一个ContactController类.

这可以通过为每种语言添加到Global.asax.cs的多个静态路由来处理,但我们希望使其非常动态,并希望系统用户能够通过内容管理更改URL的转换系统.所以我们需要从URL到控制器和动作的某种动态映射.

通过查看MVC3的源代码,我发现MvcHandlerProcessRequestInit方法负责确定要创建哪个控制器.它只是在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)

asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

4
推荐指数
1
解决办法
2449
查看次数

HttpHandler无法在ASP.NET MVC3 Web应用程序中工作

我最近采用了一个已经升级到.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

4
推荐指数
1
解决办法
5919
查看次数

ASP.NET Web API中没有区域的多级路由

我正在尝试使用新的ASP.NET Web API执行以下操作:

/api/business/{id}获取业务目录信息的GET .对同一URL的PUT更新信息等.该部分工作正常.当我想要添加以前曾经是一个动作的内容时,我遇到的问题就是查看该业务的评论.理想情况下,我希望在/api/business/{id}/reviewsGET返回评论,POST提交新评论等等时可以访问.

在普通的ASP.NET MVC应用程序中,我可以定义两个操作方法(Review和PostReview),然后使用属性来更改操作名称并接受第二个函数的HTTP方法.我希望有一些方法可以在新系统中使用类,但我无法弄清楚它是什么,我在文档中没有看到任何关于这个问题的内容.

使用领域也没有工作,尽我可以告诉:我需要的/business/{id}URL的工作,并打破区域.

asp.net-mvc asp.net-mvc-routing asp.net-web-api

4
推荐指数
1
解决办法
4650
查看次数

在控制器上找不到公共操作方法

我有以下控制器方法:

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)

为什么我会收到此错误,如何解决?谢谢!

c# asp.net-mvc controller asp.net-mvc-routing

4
推荐指数
1
解决办法
2万
查看次数

Web API路由和Web API帮助页面:如何避免重复输入

我正在我的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

4
推荐指数
1
解决办法
2355
查看次数

如何使用不同参数类型的相同路由?

我有一个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

4
推荐指数
1
解决办法
1734
查看次数

ASP.NET Core 1.0中的属性路由

我是否需要在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

4
推荐指数
1
解决办法
2074
查看次数