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