“参数字典包含参数的空条目” – 如何解决?
我试图实现一个编辑页面,以便pipe理员修改数据库中的数据。不幸的是我遇到了一个错误。
下面的代码:
public ViewResult Edit(int productId) { // Do something here }
但我得到这个错误:
"The parameters dictionary contains a null entry for parameter 'productId' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ViewResult Edit(Int32)' in 'WebUI.Controllers.AdminController'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters"
我在Global.asax.cs
改变了我的路线,如下所示:
routes.MapRoute( "Admin", "Admin/{action}/{ productId}", new { controller = "Admin", action = "Edit", productId= "" } );
但我仍然得到错误。
productId
空string(在你的默认路由中)将被框架parsing为一个空条目,并且由于int
不允许为null
…你会得到错误。
更改:
public ViewResult Edit(int productId)
至
public ViewResult Edit(int? productId)
如果你想允许调用者不必传入一个产品ID,这就是你想要做什么的基础上你的路线configuration的方式。
您也可以重新configuration您的默认路由,以便在没有提供productId时传递一些已知的默认路由:
routes.MapRoute( "Admin", "Admin/{action}/{ productId}", new { controller = "Admin", action = "Edit", productId= -1 }
在Pro ASP.Net中运行的SportStore示例之后,我遇到了同样的问题
该解决scheme实际上是我的索引视图有以下代码。
@Html.ActionLink("Edit", "Edit", new { id=item.ProductID }) |
但是我的控制器中的编辑方法被定义为
public ViewResult Edit(int productId)
改变我的索引视图来阅读
@Html.ActionLink("Edit", "Edit", new { productId=item.ProductID }) |
解决了这个问题
以下是如何忽略任何控制器方法调用的这种参数错误的方法:
public class MyControllerBase { //... protected override void OnActionExecuted(ActionExecutedContext filterContext) { if (filterContext.Exception != null) { var targetSite = filterContext.Exception.TargetSite; if (targetSite.DeclaringType != null) if (targetSite.DeclaringType.FullName == typeof(ActionDescriptor).FullName) if (targetSite.Name == "ExtractParameterFromDictionary") // Note: may be changed in future MVC versions { filterContext.ExceptionHandled = true; filterContext.Result = new HttpStatusCodeResult((int)HttpStatusCode.BadRequest); return; } //... } // ... } }
productId
应该被限制为int
types。
new {controller="Admin", action="Edit"}, new {productId = @"\d+" }
也许你忘了在视图中传递所需的数据(在本例中是'productId')。
我假设你尝试通过点击索引页面中的链接来访问详细信息,我也将其视为“View \ Admin \ index.cshtml”
<td> @Html.ActionLink("Edit", "Edit", new { productId = item.ProductId }) | @Html.ActionLink("Details", "Details", new { productId = item.ProductId }) | //note the productId is filled by item.ProductId @Html.ActionLink("Delete", "Delete", new { productId = item.ProductId }) </td>
不这样做会导致所有参数为空,从而导致错误。
标准的“int”类(int32)不接受空值,在这种情况下,它将从空string转换为int失败,并尝试给它赋值null。
我可能会看看你正在努力完成的任务 – 如果你试图强制pipe理员为他们提供一个productID来编辑数据库中的logging,我会考虑把它放到Request对象中或者一些其他的方法,会给一些更多的多function性。
在路线上更改它可能会暗示其他路线使用相同的url。 保持简单,覆盖所有基地。
[HttpGet] public ActionResult ThePage(int id = -1) { if(id == -1) { return RedirectToAction("Index"); } //Or proceed as normal }
如果这是你访问页面时得到的一个错误,这也是很好的,因为你需要一个id(例如,当用户不需要的时候把url放在地址栏中),然后设置参数设置为可选值。
编辑:对不起int,只要问的问题
- System.MissingMethodException:找不到方法?
- REST和WebServices之间的区别
- 在Visual Studio 2012中debugging.NET Framework源代码?
- Visual Studio 2013 ASP.NET项目中的Antlr包的目的是什么?
- 如何使用ConfigurationManager.AppSettings
- 有没有办法在.ASPX页面注释掉标记?
- 使用ASP.NET Web API访问会话
- “System.Data.Entity.Internal.AppConfig”的types初始值设定项引发exception
- 错误:types在两个目录中都存在