ASP MVC:带有可选字符串参数的索引操作

时间:2014-09-16 11:09:20

标签: c# .net asp.net-mvc asp.net-mvc-4 routes

我想要一个带有可选字符串参数的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时,控制器被正确调用,参数被正确传递。但后来似乎找不到视图。这是我发现的错误:

enter image description here

7 个答案:

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