C# mvc路由到http post上不正确的url

C# mvc路由到http post上不正确的url,c#,asp.net-mvc,C#,Asp.net Mvc,应用程序的默认url为 默认页面上有一个带有“Team”的菜单项,该菜单项应重定向到另一个具有索引的控制器,该控制器将在以下url处显示dropdownlist 到目前为止,它运作良好 但是,当用户在dropdownlist中选择一个项目时,它应该转到下面的url 但它是指向 并抛出404错误。服务器名后缺少文件夹路径“Root/ITProjects”。它在没有文件夹路径但部署到测试或产品服务器失败的localhost上运行良好 [AuthorizeAD(Groups = "APP_xx

应用程序的默认url为

默认页面上有一个带有“Team”的菜单项,该菜单项应重定向到另一个具有索引的控制器,该控制器将在以下url处显示dropdownlist

到目前为止,它运作良好

但是,当用户在dropdownlist中选择一个项目时,它应该转到下面的url

但它是指向

并抛出404错误。服务器名后缺少文件夹路径“Root/ITProjects”。它在没有文件夹路径但部署到测试或产品服务器失败的localhost上运行良好

[AuthorizeAD(Groups = "APP_xxxx_Users")]
public class TeamController : Controller
{
    public int pageSize = 5;
    private IProjectService _projectService;

    public TeamController(IProjectService projectService)
    {
        this._projectService = projectService;
    }
    public ActionResult Index(int? Id, int? page)
    {
        int pageNumber = (page ?? 1);

        var viewModel = new TeamViewModel();
        if (Id != null)
        {
            viewModel.SelectedMember = (int)Id;
            viewModel.Tasks = this._projectService.GetTasksByStaff(viewModel.SelectedMember).ToPagedList(pageNumber, pageSize);             
        }
        return View(viewModel);
    }
    [HttpPost, ActionName("Index")]
    public ActionResult IndexPost(int Id, int? page)
    {
    int pageNumber = (page ?? 1);
    var viewModel = new TeamViewModel();
    viewModel.SelectedMember = Id;
    if (ModelState.IsValid)
    {
        viewModel.Tasks = this._projectService.GetTasksByStaff(viewModel.SelectedMember).ToPagedList(pageNumber, pageSize);
    }
    return View(viewModel);
    }
}

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

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
选择dropdownlist项时作为索引视图的一部分

    @Html.DropDownListFor(m => m.SelectedMember, new SelectList(Model.StaffList, "UniqueId", "Initials", Model.SelectedMember), new { @class = "btn btn-default btn-color", onchange = @"form.action='/Team/Index?Id=' +this.value;form.submit();" })

控制器的默认路由如下所示:

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

您可以在URL之前添加/Root/ITProjects/以更改默认控制器路径

您的MVC应用程序位于另一个应用程序的子目录中,因此IIS会考虑父应用程序的根,而不是MVC应用程序的根

在IIS中,您需要将虚拟目录转换为应用程序:选择您的虚拟目录并“转换为应用程序”。如果无法执行此操作,则需要在routes.config中修改路由以将虚拟目录考虑在内:

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

我确实将虚拟目录转换为应用程序。正如我在文章中提到的(刚刚更新),默认和重定向到其他控制器索引方法没有问题。只有当有来自其他控制器的http post时,它才会失败。当我将route.config更改为Root/ITProjects/…,它会在所有页面上抛出404错误您的表单在视图中看起来像什么?更具体地说,您是如何在表单中构建POST url的?最后,看看Dev Tools中呈现的表单-post URL是什么?我已经在文章底部的索引视图中发布了dropdownlistfor。基于所选项目,我调用onchange事件。您的帖子将准确地发送到您要求的位置:
form.action='/Team/Index
。您需要将帖子更新为
form.action='/Root/ITProjects/Team/Index
,但在localhost、test和prod环境中会有不同的文件夹结构。是否有任何通用方法可以根据应用程序所在的环境标识文件夹结构并相应地重定向。