使用多个参数(字符串、日期时间)的路由不起作用

Posted

技术标签:

【中文标题】使用多个参数(字符串、日期时间)的路由不起作用【英文标题】:Routing with multiple parameters (String, DateTime) is not working 【发布时间】:2019-09-15 13:42:52 【问题描述】:

我有三个同名的 Action Result 方法,所有这些都是 [httpPost] 类型。当我添加属性路由时,我使用属性路由来绑定这些方法,这些方法中的任何一个都没有被调用,但是当我从这些方法中的任何一个中删除路由属性时,只有那个方法被调用。请指导我哪里做错了。提前致谢。

第一种方法

    [HttpPost, ValidateAntiForgeryToken]
    [Route("Home/PrintFileMovement/option/SearchBox")]
    public ActionResult PrintFileMovement(string option, string SearchBox)
    
        FileMovementManagementSystem.FileViewModel.FileViewModel fvm = new FileMovementManagementSystem.FileViewModel.FileViewModel();
        List<File_Movement> fileMovementModel;


        if (option == "DiaryNo")
        
            //FileMovementManagementSystem.FileViewModel.FileViewModel fvm = new FileMovementManagementSystem.FileViewModel.FileViewModel();
            fileMovementModel = fvm.SearchFileByDiaryNo(SearchBox);
            return View(fileMovementModel);
        
        else if (option == "Subject")
        
           // FileMovementManagementSystem.FileViewModel.FileViewModel fvm = new FileMovementManagementSystem.FileViewModel.FileViewModel();
            fileMovementModel = fvm.SearchFileBySubject(SearchBox);
            return View(fileMovementModel);
        

        fileMovementModel = fvm.GetFileMovement();
        return View(fileMovementModel);
    

没有路由属性也能正常工作的第二种方法

   [HttpPost, ValidateAntiForgeryToken]
   [Route("Home/PrintFileMovement/option/Date:datetime")]

    public ActionResult PrintFileMovement(string option, DateTime? Date)
    

        FileMovementManagementSystem.FileViewModel.FileViewModel fvm = new FileMovementManagementSystem.FileViewModel.FileViewModel();
        List<File_Movement> fileMovementModel;
        if (option == "ReceiveDate")
        

             fileMovementModel = fvm.SearchFileByReceiveDate(Date.Value);
             return View(fileMovementModel);
        

            fileMovementModel = fvm.GetFileMovement();
            return View(fileMovementModel);
    

这是第三种方法

    [HttpPost, ValidateAntiForgeryToken]
    [Route("Home/PrintFileMovement/MyDate:datetime")]
    public ActionResult PrintFileMovement(DateTime? MyDate)
    
        FileMovementManagementSystem.FileViewModel.FileViewModel fvm = new FileMovementManagementSystem.FileViewModel.FileViewModel();
        List<File_Movement> fileMovementModel = fvm.SearchFileByReceiveDate(MyDate.Value);
        return View(fileMovementModel);

    

路由配置

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

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



    

【问题讨论】:

我前段时间有some simular question。也许这会有所帮助。 添加路由设置(RouteConfig.cs)和控制器属性会很有帮助 @vasily.sib 请在此处查看我更新的问题代码,我添加了 routeconfig.cs 代码。 @vasily.sib 请在此处查看我更新的问题代码,我添加了 routeconfig.cs 代码。 你的控制器属性怎么样?你有一些[RoutePrefix("Home")] 超过public class HomeController : Controller 行吗? 【参考方案1】:

您需要在RegisterRoutes 中启用routes.MapMvcAttributeRoutes();

并将参数中的DateTime 更改为DateTime?,并在操作中使用MyDate.Value

确保输入标签的名称与参数名称相同

public ActionResult PrintFileMovement(string option, DateTime? Date)

<input type="text" name="option" />
<input type="text" name="Date" />

更新:

我刚刚尝试重现您的情况,因为您使用POST方法,所以您需要在Route中删除/option/Date:datetime,POST方法没有通过URL发送数据。

改成这个就行了

[HttpPost, ValidateAntiForgeryToken]
[Route("Home/PrintFileMovement")]

public ActionResult PrintFileMovement(string option, DateTime? Date)

在cshtml文件中:

<form action="/Home/PrintFileMovement" method="post">
    @Html.AntiForgeryToken();
    @*<input type="text" name="option"/>*@
    <input type="text" name="Date"/>
    <input type="submit" value="Save"/>
</form>

【讨论】:

您标记为 HttpPost 并且您需要工具来 POST 数据,或者您想对所有人使用 GET 方法?或者您可以发布您的视图 cshtml 我之前的评论没有正确编辑,但问题仍然存在。为什么你认为他们需要在动作参数中将DateTime 更改为DateTime? @HienNguyen 我想发布我的观点 cshtml。 @HienNguyen 当我更改为此 [Route("Home/PrintFileMovement")] 然后我得到资源未找到错误消息 我添加了cshtml内容

以上是关于使用多个参数(字符串、日期时间)的路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

与当前日期比较时,通过多个元键查询帖子不起作用

Laravel - 通过路由传递参数后Javascript不起作用

Angular 8嵌套路由和多个路由器插座不起作用

多个日期选择器不起作用

带有查询参数的 MVC 属性路由不起作用

Laravel 多重身份验证保护路由多个中间件不起作用