在我的 ASP.NET MVC 应用程序中,我试图实现以下概念:
- 浏览
http://.../PersonData/Show?id=A5668A31-9AAC-4A14-B471-7C9BA236961D
应显示由给定 ID 标识的人员的数据。 - 浏览
http://.../PersonData/Show
应该显示一个带有表单的视图,我可以在其中将 ID 输入到文本框中。当我提交表单时,浏览器应该导航而不是发布到上面给出的 URL(即,表单的方法设置为 GET)。 - 当我在不输入 ID 的情况下提交表单(导致 URL
http://.../PersonData/Show?id=
被浏览)时,ASP.NET MVC 模型验证应该显示一条消息,指出需要 ID。(启用或不启用 JavaScript。)
为了实现这一点,我建立了一个这样的模型:
class Model
{
[Required]
public Guid? Id { get; set; }
}
现在我有一个问题,当第一次浏览http://.../PersonData/Show
时,ASP.NET 模型验证立即给出了一个需要 ID 的错误,因为它不区分没有 ID ( ?id=
) 提交表单的情况和提交的情况第一次调用该操作(根本没有给出 id)。
我有过的想法:
- 使用两个不同的控制器操作和 URL(如
http://.../PersonData/Search
和http://.../PersonData/Show?id=
)来区分首次浏览和空表单提交。 - 使用额外的表单参数(如
http://.../PersonData/Show
andhttp://.../PersonData/Show?valueGiven=true&id=
)。 - 使用该
Request
对象检查操作方法中的 URL 参数,并清除该键是否存在于 URL 中的ModelState
错误。"id"
解决此问题的最佳/建议方法是什么?有没有更好的第四种方法?
(一件事不起作用是为 GET 操作添加两个具有相同名称的操作方法:
[HttpGet]
public void Show() { /* return view with initial browsing logic */ }
[HttpGet]
public void Show(Model model) { /* return view with subsequent browsing logic */ }
ASP.NET MVC 似乎不允许这样做。)
2013-06-25 更新:对不起,我的示例中有两个错误,ID 应该是一个Guid
,而不是一个字符串;当然,我将模型绑定到我的操作方法中,因为我需要Required
评估属性。
这是我的路由配置:
public static void RegisterRoutes (RouteCollection routes)
{
routes.IgnoreRoute ("{resource}.axd/{*pathInfo}");
routes.MapRoute (
name: "Default",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "Index" }
);
}