Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数字典包含参数';id';不可为空的类型_C#_Asp.net Mvc_Routes_Actionresult - Fatal编程技术网

C# 参数字典包含参数';id';不可为空的类型

C# 参数字典包含参数';id';不可为空的类型,c#,asp.net-mvc,routes,actionresult,C#,Asp.net Mvc,Routes,Actionresult,我正试图通过默认路径中的id参数从数据库检索数据: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaul

我正试图通过默认路径中的
id
参数从数据库检索数据:

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
在这个ActionResult中,我试图基于route id参数呈现一个自定义用户控件,以便检索所请求页面的相关数据

public ActionResult InitPageNav(int id)
{
      PageModel page = PageNavHelper.GetPageByID(id);
      return PartialView("UserControls/_PageNavPartial", page);
}
编辑*

但我一直在犯错误:

参数字典包含不可为空类型的参数“id”的空条目


谁能看出我哪里做错了

要调用该操作,URL中需要一个整数,如:/Home/InitPageNav/1

要么这样,要么修改action方法以允许一个可为空的整数(但这没有意义,除非您有一个默认页面,如果没有提供id,您可以检索该页面)

如果您不希望url中有页面id,则需要其他内容来标识页面,如标题

routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{title}", // URL with parameters
            new { controller = "Home", action = "Index", title = UrlParameter.Optional } // Parameter defaults
        );
以及行动:

public ActionResult InitPageNav(String title)
{
      PageModel page = PageNavHelper.GetPageByTitle(title);
      return PartialView("UserControls/_PageNavPartial", page);
}
只需确保处理title参数为空/null的情况。通常,您应该使用Mvc框架中已有的帮助程序/扩展来构建URL

@Html.ActionLink("Link text", "action", "controller", new { title = "whatever" }, null)
或者在更高级的助手中

public static MvcHtmlString CreateMenuItems(this UrlHelper url, string action, string text)
{
     var menuItem = new TagBuilder("li");
     var link = new TagBuilder("a");

     //Get current action from route data
     var currentAction = (string)helper.RequestContext.RouteData.Values["action"];
     link.Attributes.Add("href", url.Action(action, "home", new { title = "whatever" }));

     if (currentAction == action)
     {
         menuItem.AddCssClass("selected");
     }

     link.SetInnerText(text);
     menuItem.InnerHtml = link.ToString();

     return MvcHtmlString.Create(menuItem.ToString());
 }

如果该异常/错误是由ASP.NET MVC框架引发的,则该异常的原因是HTTP请求上未传递“id”参数

尝试将操作方法签名重新定义为以下内容:

    public ActionResult InitPageNav(int? id) //id is now a nullable int type
    {
          if(!id.HasValue) //id parameter is set ?
          {
                //return some default partial view or something 
          }

          PageModel page = PageNavHelper.GetPageByID(id);
          return PartialView("UserControls/_PageNavPartial", page);
    }
编辑:
如果您认为将id参数类型更改为“string”更有用,那么您只需更改操作方法签名。

如何在视图中生成链接?示例生成的url是什么样子的?那么url是什么样子的呢/controller/initpagenav/1?我正在使用一个助手方法来生成我的链接,我将编辑postRight,好的,如果我将页面id放在链接的末尾,它会工作,但我不希望每个URL都显示id。有没有办法通过路由删除它?我已经尝试过了,但是
id
总是
null
。然而,我可以通过将ID放在我所有链接的末尾来解决这个问题,IMO是一个糟糕的链接solution@Duane您能否显示生成的URL,这将有助于解决此问题?
就是一个例子。就像我说的,如果我使用
  • ,它会起作用,但我更喜欢没有ID的URL。我最初做的是类似的事情,但通过文件名获取页面,但并不认为这是一个好主意,因为文件名可以很容易地更改,这会导致它崩溃,另一方面,db中的PK是另一回事。但是如果密钥是ID,那么您将需要URL中的ID,或者考虑其他东西!你需要告诉操作使用哪个页面,不管是哪种方式。因此控制器上的操作需要一些参数来告诉它要获取和使用哪个页面。我想我可以根据请求获取。Url还是其他什么?至少如果文件名改变了,url也会随之改变,然后只需在数据库中添加一个url字段?明白了!但您还需要了解,操作需要来自某个地方的参数,因此它要么是url的一部分,如so:/controller/action/id,要么是旧的操作方式:/controller/action?id=1
        public ActionResult InitPageNav(int? id) //id is now a nullable int type
        {
              if(!id.HasValue) //id parameter is set ?
              {
                    //return some default partial view or something 
              }
    
              PageModel page = PageNavHelper.GetPageByID(id);
              return PartialView("UserControls/_PageNavPartial", page);
        }