【问题标题】:ASP MCV: Index action with optional string parameterASP MVC:带有可选字符串参数的索引操作
【发布时间】:2014-11-10 02:38:48
【问题描述】:

我想要一个带有可选字符串参数的索引操作。我无法让它工作。

我需要以下路线:

http://mysite/download
http://mysite/download/4.1.54.28

第一个路由会发送一个空模型到索引视图,第二个路由会发送一个带有版本号的字符串。

如何定义路由和控制器?

这是我的路线定义:

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时,正确调用了控制器,并且正确传递了参数。但后来似乎没有找到该视图。这是我发现的错误:

【问题讨论】:

  • public ActionResult Index(string version="") { return View(version); }
  • 您是否定义了其他路线?这是在默认路由之前定义的吗?
  • 你的路线有action="Version",但你的方法是Index(string version)
  • 问题出在version参数中的dots。试试http://mysite/download/4-1-54-28,应该会点击action方法
  • 然后是别的东西。我刚刚将你的代码复制到我的项目中,它工作正常。

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


【解决方案1】:

string? 将不起作用,因为string 不是值类型。

您可以为参数设置默认值:

public ActionResult Index(string version="")
{
    return View(version);
}

【讨论】:

    【解决方案2】:

    通过以下方式将参数传递给视图已修复该问题:

    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)
    

    【讨论】:

      【解决方案3】:

      您的 Download 路由与您的 Default 路由冲突。注释掉Download 路由,它可能会起作用。

      顺便说一句,您可以安装RouteDebugger 来自己解决这些问题。

      【讨论】:

      • 发帖前请尽量简化您的问题。这些点具有误导性。如果您将控制器方法更改为只期望一个 int 会发生什么?全新的解决方案会发生什么?你试过 RouteDebugger 或 Glimpse 吗?
      【解决方案4】:

      您的控制器正在寻找与在 url 中输入的版本属性同名的视图(例如 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();
      }
      

      希望对你有所帮助

      【讨论】:

        【解决方案5】:

        您没有在 url 中设置动作名称,例如 {action} 你可以试试:

        routes.MapRoute(
                name: "Download",
                url: "Download/{action}/{version}",
                defaults: new { controller = "Download", action = "Index", version = UrlParameter.Optional }
            );
        

        【讨论】:

          【解决方案6】:

          我很确定这是因为在视图中你声明它是一个可选参数,但你的控制器说它是强制性的。更改索引方法的签名以期望可以为空的参数

              public ActionResult Index(string? version)
              {
                  return View(version);
              }
          

          【讨论】:

            【解决方案7】:

            为什么不在你的下载控制器中有两种方法:

            public ActionResult Index()
            {
                    return View();
            }
            [HttpGet, ActionName("Index")]
            public ActionResult IndexWithVersion(string version)
            {
                    return View(version);
            }
            

            【讨论】:

              猜你喜欢
              • 2016-11-17
              • 1970-01-01
              • 2012-04-11
              • 2011-06-30
              • 1970-01-01
              • 1970-01-01
              • 2018-03-14
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多