Маршрутизация с несколькими параметрами (String, DateTime) не работает - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть три метода результата действия с одинаковым именем, и все они являются типами [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);

    }

RouteConfig

    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 }
        );



    }

1 Ответ

1 голос
/ 26 апреля 2019

Вам нужно включить routes.MapMvcAttributeRoutes(); в RegisterRoutes

и измените DateTime на DateTime? в вашем параметре и используйте MyDate.Value в действии.

Убедитесь, что имя входного тега совпадает с именем параметра

public ActionResult PrintFileMovement(string option, DateTime? Date)

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

Обновлен:

Я только что попытался воспроизвести ваш случай, потому что вы используете метод POST, поэтому вам нужно удалить /{option}/{Date:datetime} в Route, метод 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>
...