我想要一个带有可选字符串参数的Index操作。我无法让它发挥作用。
我需要以下路线:
http://mysite/download
http://mysite/download/4.1.54.28
第一个路由会将一个空模型发送到Index视图,第二个路由将发送一个带有版本号的字符串。
如何定义路线和控制器?
这是我的路线定义:
routes.MapRoute(
name: "Download",
url: "Download/{version}",
defaults: new { controller = "Download", action = "Index", version = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这是控制器:
public ActionResult Index(string version)
{
return View(version);
}
为什么这不起作用?我不是ASP MVC的专家,但这似乎是一个非常简单的问题。
http://mysite/downloads
时,它可以正常工作http://mysite/downloads/4.5.6
时,控制器被正确调用,参数被正确传递。但后来似乎找不到视图。这是我发现的错误:
答案 0 :(得分:5)
修复了以下问题将参数传递给视图的问题:
public ActionResult Index(string version)
{
return View((object)version);
}
或者
public ActionResult Index(string version)
{
return View("Index", version);
}
当您将string
模型传递给视图时,如果模型是string
参数,则由于以下overload method
View(String viewName)
答案 1 :(得分:4)
string?
无效,因为string
不是值类型。
您可以为参数设置默认值:
public ActionResult Index(string version="")
{
return View(version);
}
答案 2 :(得分:1)
您的Download
路由与您的Default
路由冲突。注释掉Download
路线,它可能会有效。
顺便说一句,你可以安装RouteDebugger来解决这些问题。
答案 3 :(得分:1)
您的控制器正在寻找与在网址中输入的版本属性同名的视图(例如4.1.54.28)。您是否有意寻找具有该名称的视图,在这种情况下,它应该位于Views / Download文件夹或您的项目中。但是,如果您只是想将它作为变量传递给默认视图,以便在页面上使用,最好将其粘贴在模型中,或者如果它是一次性的话,您可以将其粘贴在ViewBag中。
您也不需要使用:
Public ActionResult Index(string version)
您可以使用routedata,例如
Public ActionResult Index()
{
string version = RouteData.Values["Version"].ToString();
ViewBag.version = version;
return View();
}
希望有一些帮助
答案 4 :(得分:0)
您未在网址中设置操作名称,例如{action} 你可以尝试:
routes.MapRoute(
name: "Download",
url: "Download/{action}/{version}",
defaults: new { controller = "Download", action = "Index", version = UrlParameter.Optional }
);
答案 5 :(得分:0)
我很确定这是因为在View中你说它是一个可选参数,但你的控制器说它是强制性的。更改索引方法的签名以期望可以为空的param
public ActionResult Index(string? version)
{
return View(version);
}
答案 6 :(得分:-1)
为什么下载控制器中没有两种方法:
public ActionResult Index()
{
return View();
}
[HttpGet, ActionName("Index")]
public ActionResult IndexWithVersion(string version)
{
return View(version);
}