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