标签: asp.net-mvc-routing

ASP.NET MVC URL路由不会给我漂亮的URL

我已经建立了一个ASP.NET MVC项目,一切都运行良好,但我确实有一个路由问题.我的Global.asax看起来像这样:

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

        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }
Run Code Online (Sandbox Code Playgroud)

所以,没有什么不寻常的.我的问题是,当我使用HTML.ActionLink链接到控制器/ action/params时,如下所示:

<%= Html.ActionLink("My link", "SomeAction", "SomeController", new {param="someParam"})%>
Run Code Online (Sandbox Code Playgroud)

它应该产生(至少在我的头脑中有意义)一个链接,如:http://www.localhost/SomeController/SomeAction/someParam.

但它会生成这样的链接: http://localhost/SomeController/SomeAction?param=someParam

如果我手动创建链接到预期结果的链接(SomeController/SomeAction/someParam),则调用正确的控制器和操作,但action方法中定义的参数始终为null.

有任何想法吗?

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

5
推荐指数
2
解决办法
922
查看次数

MVC控制器索引有时是404?

我添加了3个控制器,对于其中一个控制器,默认情况下索引视图不起作用.

Works(shows index):
http://localhost:1767/Employees/  
http://localhost:1767/Employees/Index
http://localhost:1767/Home/       
http://localhost:1767/Home/Index
http://localhost:1767/
http://localhost:1767/Companies/Index

Doesn't work(gives 404 error):
http://localhost:1767/Companies/  
Run Code Online (Sandbox Code Playgroud)

1)我创建了一个实体框架类库,它是从包含Employees和Companies表的数据库生成的.

2)创建了一个MVC 3空项目.

3)从MVC项目向EF类库项目添加了项目引用.

4)添加了一个控制器,在添加控制器对话框中,我选择了EF模型和其中一个表,并命名为控制器CompaniesController

5)然后我记得我需要一个HomeController,所以我添加了另一个控制器,命名为HomeController,并再次选择了公司实体.

6)最后,我添加了一个EmployeesController,选择了Employees实体.

这是我的Global.asax.cs中唯一的路线:

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

为什么http:// localhost:1767/Companies / URL不像所有其他控制器一样默认为索引操作?我做了一些练习MVC项目,似乎总是遇到这个问题.员工控制器默认为索引工作正常,即使没有路由告诉它这样做?

编辑:这是我收到的错误:

The resource cannot be found.
Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, …
Run Code Online (Sandbox Code Playgroud)

model-view-controller asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

5
推荐指数
1
解决办法
6410
查看次数

在Orchard CMS中路由自定义控制器

我在设置路由到Orchard中的自定义控制器时遇到了一些麻烦.

我创建了一个视图:

@model dynamic
@{
    Script.Require("jQuery");
}
@using (Html.BeginForm("Send", "Email", FormMethod.Post, new { id = "contactUsForm" }))
{
    <fieldset>
        <legend>Contact Us</legend>
        <div class="editor-label">Name:</div>
        <div class="editor-field">
            @Html.TextBox("Name", "", new {style = "width: 200px"})
        </div>
        <div class="editor-label">Email Address:</div>
        <div class="editor-field">
            @Html.TextBox("Email", "", new {style = "width: 200px"})
        </div>
        <div class="editor-label">Telephone Number:</div>
        <div class="editor-field">
            @Html.TextBox("Telephone", "", new {style = "width: 200px"})
        </div>
        <div class="editor-label">Message:</div>
        <div class="editor-field">
            @Html.TextArea("Message", "", new {style = "width: 200px"})
        </div>
        <br/>
        <input id="ContactUsSend" type="button" value="Submit" />
    </fieldset>
}
@using …
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
3941
查看次数

MVC4索引操作无法正常工作

我创建了一个带有Index动作的控制器.我的所有其他操作返回视图就好......但由于某种原因,我必须指定完整的URL以使索引视图返回.这几乎就像我的路线无法正常工作.

例如,要转到属性页面,您必须转到/ Properties/Index而不是/ Properties /.我的路线如下.任何帮助将不胜感激!

routes.MapRoute(
            name: "Index",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
1
解决办法
588
查看次数

ASP.NET Web API获取子列表(分层资源)

我有以下休息架构,我想使用ASP.NET Web Api实现:

http://mydomain/api/students
http://mydomain/api/students/s123
http://mydomain/api/students/s123/classes
http://mydomain/api/students/s123/classes/c456
Run Code Online (Sandbox Code Playgroud)

我使用ApiController和以下两种方法使前两个链接正常工作:

public class StudentsController : ApiController {
  // GET api/students
  public IEnumerable<Student> GetStudents() {  
  }

  // GET api/students/5
  public IEnumerable<Student> GetStudent(string id) {  
  }
}
Run Code Online (Sandbox Code Playgroud)

在同一个控制器中,(或者我需要一个名为ClassesController的不同控制器吗?),我该如何实现最后两个链接?另外,"类"部分的路由是什么样的(如果需要)?

这是我的WebApiConfig(我想保持动态,而不是硬编码到/ classes的路径,如果可能的话:

config.Routes.MapHttpRoute(
  name: "DefaultApi",
  routeTemplate: "api/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);   

// EDIT - I'm getting 404's when trying to use this
context.Routes.MapHttpRoute(
  name: "JobsApi",
  routeTemplate: this.AreaName + "/Students/{id}/Classes/{classId}",
  defaults: new { classId = RouteParameter.Optional }
);   
Run Code Online (Sandbox Code Playgroud)

编辑这是我新创建的ClassesController:

public class ClassesController : ApiController …
Run Code Online (Sandbox Code Playgroud)

c# asp.net rest asp.net-mvc-routing asp.net-web-api

5
推荐指数
2
解决办法
6334
查看次数

WebAPI控制器中的MVC路由

关于MVC和WebAPI中的路由的快速问题.我添加了路由config.cs的路由:

        routes.MapRoute(
            name: "ConfirmEmail",
            url: "ConfirmEmail/{userid}",
            defaults: new { controller = "Email", action = "ConfirmEmail" }
        );
Run Code Online (Sandbox Code Playgroud)

这是按照正常情况在global.asax中注册的:

RouteConfig.RegisterRoutes(RouteTable.Routes);
Run Code Online (Sandbox Code Playgroud)

我正在尝试生成一个URL,以便在电子邮件中使用,该电子邮件是作为WebAPI控制器函数中的函数调用的一部分发送的.我正在使用UrlHelper.Link函数尝试生成一个URL,但是我收到一条错误,说明无法通过名称找到该路由:

var url = Url.Link("ConfirmEmail", new { userid = "someUserId" });
Run Code Online (Sandbox Code Playgroud)

现在我的印象是路由字典在MVC和WebAPI控制器上下文中共享但是我看不到传入Web API调用的路由字典中的MVC路由(在Request对象上),但是我已经定义了WebAPI路由.

我错过了什么吗?

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

5
推荐指数
2
解决办法
2487
查看次数

Asp.net MVC Routing Issue 403.14

one of my controller could not load "Index".for example :

 http://localhost:51638/Reserve/
Run Code Online (Sandbox Code Playgroud)

doesn't work.but http://localhost:51638/Reserve/Index works. and this problem is just for one of my controller and other is correct. and my RouteConfig is:

public static void RegisterRoutes(RouteCollection routes)
        {


            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            // BotDetect requests must not be routed
            routes.IgnoreRoute("{*botdetect}",
              new { botdetect = @"(.*)BotDetectCaptcha\.ashx" });
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "UserHome", action = "Index", id = UrlParameter.Optional }
            );
        }
Run Code Online (Sandbox Code Playgroud)

after delete the controller and add …

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

5
推荐指数
1
解决办法
907
查看次数

Asp.Net MVC5 - Html.Action - 属性路由 - 导致异常的奇怪行为

以下是我整个网站中不同操作和视图的一些奇怪行为:

每当我POST一些动作方法并且Model.IsValid为false时,我都会返回视图.每当在返回的视图中调用Html.Action()时,我都会遇到以下异常:

(System.Web.HttpException): No matching action was found on controller 'xyz'. 

This can happen when a controller uses RouteAttribute for routing, 
but no action on that controller matches the request.
Run Code Online (Sandbox Code Playgroud)

我正在使用属性路由.

public class RouteConfig
{
    // REGISTER ROUTES

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapMvcAttributeRoutes();        
    }     
}
Run Code Online (Sandbox Code Playgroud)

因此,即使Html.Action调用第一次在GET操作方法中返回View(),Html.Action总是在POST返回View()之后抛出此异常.这是我网站上的一般模式.

跆拳道?有什么想法在这里出了什么问题?我唯一能想到的是我随着时间的推移添加了更多的路线,现在它很困惑.如果是这样的话,我该如何修复或测试?

我刚想到我有很多路由/动作方法,其中动作方法的路径的get和post版本是相同的,除了action方法的GET或POST属性.我以前确定每条路线都是完全独特的,因为我得到了一些歧义,但是将其改回了相同的路线,用于获取和后置动作方法,唯一的区别是get或post属性......我变得确信它是路由问题,但我不知道具体是什么问题.我有数百种动作方法的路由属性.

我以前从未见过如此微妙的东西,甚至不知道如何开始解决这样的问题.我不知道它是简单还是复杂,如果它是我的代码或框架.任何帮助将不胜感激.

更新:

一些示例代码,不确定它会有所帮助,因为相同的事情发生在许多完全不同的操作方法和视图中的模式,无论GET,POST,授权,未授权,在角色与否,antiforgerytoken ...

从视图调用标准Html.Action.大多数时候工作正常.(不同的重载没有区别.)

@Html.Action("CategoryDropDowns", "Category")
Run Code Online (Sandbox Code Playgroud)

这是被调用的内容(确切地说返回的内容没有区别,可能是ViewResult,可能是一个int).

// GET: /category/category-drop-downs   
[HttpGet]
[Route("category/category-drop-downs")]           
public ViewResult CategoryDropDowns()
{

}
Run Code Online (Sandbox Code Playgroud)

如果验证失败,则返回视图:

public ActionResult CreateListing(ListDetails listDetails)
{                                       
    if (ModelState.IsValid)
    {
    }
    else
    { …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc asp.net-mvc-routing attributerouting asp.net-mvc-5

5
推荐指数
1
解决办法
1948
查看次数

属性路由在MVC4中不起作用

Attribute RoutingMVC4申请中使用.我已设定路线[Route("test-{testParam1}-{testParam2}")].这里`{testParam2}'可能包含'test'这个词.例如,如果我输入如下的网址,

localhost:33333/test-temp-test-tempparam2
Run Code Online (Sandbox Code Playgroud)

这给了我404错误.在url中,这里{testParam2}有两个单词test tempparam2格式化为test-tempparam2.当test单词位于最后位置时{testParam2},它运行良好.这意味着如果网址像.../test-temp-tempParam2-test运行良好.但是下面给出错误..../test-temp-test-tempParam2.

以下是可能有帮助的代码......

[Route ("test-{testParam1}-{testParam2}")]
public ActionResult Foo (int testParam2) {...}
Run Code Online (Sandbox Code Playgroud)

现在尝试关注两个网址.

  1. localhost:(port)/test-temp-1

  2. localhost:(port)/test-test-temp-1

在我的情况下,第二个错误.在这种情况下第一参数被格式化为test-temptest temp.首先运行良好.

如何解决这个问题呢?

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

5
推荐指数
1
解决办法
990
查看次数

使用带有MapSpaFallbackRoute的命名路由

我在我的ASP.NET Core SPA中使用命名路由,如下所示:

[HttpGet("", Name = HomeControllerRouteName.GetIndex)]
public IActionResult Index() => this.View();
Run Code Online (Sandbox Code Playgroud)

在我Startup.cs使用该MapSpaFallbackRoute方法回退到单页面应用程序以显示404错误页面.它目前使用控制器和操作名称来确定后备路由,如下所示:

application.UseMvc(
    routes =>
    {
        routes.MapSpaFallbackRoute(
            name: "spa-fallback",
            defaults: new { controller = "Home", action = "Index" });
    });
Run Code Online (Sandbox Code Playgroud)

Startup.cs为了保持一致性,我想在命令路由中使用命名路由.怎么能实现这一目标?

asp.net asp.net-mvc-routing single-page-application asp.net-core-mvc asp.net-core

5
推荐指数
1
解决办法
458
查看次数