我是MVC的新手,我正在使用ASP.Net MVC5建立一个网站。我对路由概念有点困惑。以下是我的route.config文件。因此,每当我进入我的主页或登录页面并输入我的凭据并单击提交按钮时,我确实看到该页面允许我转到下一页我可以找到我的信息,但URI更改为名称发布提交按钮触发的操作。例如,如果我的主页登录页面URI是这个
点击提交时,网址变为
http://localhost/home/submit但我加载的视图称为AccountInfo 不知道这是如何工作的。
此外,我将用户信息存储在会话中,并且有一个注销按钮,所以当我单击按钮时我将会话设置为null并重定向到登录操作,但是我的网址更改为这样的内容,我没有任何url,它在我的route.config中有一个参数作为url的一部分。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Test",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "TESTVIEW", id =
UrlParameter.Optional }
);
routes.MapRoute(
name: "Invoice",
url: "{Home}/{Invoice}/{q}",
defaults: new { controller = "Home", action = "GetInvoice", q =
UrlParameter.Optional }
);
routes.MapRoute(
name: "Error",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Error", id =
UrlParameter.Optional }
);
routes.MapRoute(
name: "ResetPassword",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "ResetPassword", id
= UrlParameter.Optional }
);
routes.MapRoute(
name: "Accounts",
url: "{controller}/{action}",
defaults: new { controller = "Home", action = "AccountStatus" }
);
routes.MapRoute(
name: "Register",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Register", id =
UrlParameter.Optional }
);
routes.MapRoute(
name: "Home",
url: "Home",
defaults: new { controller = "Home", action = "Login"}
);
routes.MapRoute(
name: "Home1",
url: "",
defaults: new { controller = "Home", action = "Login" }
);
}
行动方法
/// <summary>
/// Logoffs this instance.
/// </summary>
/// <returns></returns>
public ActionResult Logoff()
{
Session["AccountInfo"] = null;
//return View("Login");
return RedirectToAction("Login", new CustomerModel()); //
View("Login", new CustomerModel());
}
我的提交操作位于
之下 [ValidateAntiForgeryToken]
public ActionResult Submit(CustomerModel customerModel)
{
homeAccountViewModel = new HomeAccountStatusViewModel ();
homeAccountViewModel.Customer = customerModel;
if (ModelState.IsValidField("Username") &&
(ModelState.IsValidField("Password")))
{
logic here....
return View("AccountStatus", homeAccountViewModel);
}
else
{
return View("Login", customerModel);
}
}
任何帮助都会很有帮助。感谢
答案 0 :(得分:0)
当您的Action方法运行时,您正在调用:
return RedirectToAction("Login", new CustomerModel());
这将使用传出路由来构建URL。传出路由使用控制器,操作和任何路由值来查找匹配的路由。
在这种情况下,假设您的控制器为Home
(因为您没有指定)并且您将操作指定为Register
,则此路线将匹配:
routes.MapRoute(
name: "Register",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Register", id =
UrlParameter.Optional }
);
以上路由告诉路由引擎使用{controller}/{action}/{id}
构建URL。在这种情况下,ID是可选的,因此它不会生成结果URL。
注意:如果我没有指出您的路由完全配置错误,我会疏忽。路由框架无法区分传入路由的
{controller}/{action}/{id}
和{Home}/{Invoice}/{q}
之间的区别。如果您有可选值,情况会变得更糟。您的前两条路线都会将任意网址与0,1,2或3段匹配。由于第一场比赛总是获胜,所以你的第二场比赛(以及大部分其他路线)永远不会到达。有关详细信息,请参阅Why map special routes first before common routes in asp.net mvc?。