我正在构建我的第一个MVC应用程序,我在数据库中有一个包含3列的表:
当我点击编辑链接编辑一条记录时,它抛出以下异常:
参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于'MvcApplication1.Controllers.UserController'中方法'System.Web.Mvc.ActionResult Edit(Int32)'。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数
这是我的编辑代码:
public ActionResult Edit(int id, User collection)
{
UserDBMLDataContext db = new UserDBMLDataContext();
var q = from abc in db.User_Login_Details
where abc.Id == id
select abc;
IList lst = q.ToList();
User_Login_Details userLook = (User_Login_Details)lst[0];
userLook.Username = collection.UserName;
userLook.Password = collection.Password;
db.SubmitChanges();
return RedirectToAction("Index");
}
答案 0 :(得分:32)
您希望网址中包含id
参数,但您没有提供该参数。如:
http://yoursite.com/controller/edit/12
^^ missing
答案 1 :(得分:12)
在你的
WebApiConfig
>> Register ()
你必须改为
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
此处routeTemplate
添加了{action}
答案 2 :(得分:9)
此错误表示MVC框架无法找到您作为[{1}}方法的参数传递的id
属性的值。
MVC会在路径数据,查询字符串和表单值等位置搜索这些值。
例如,以下内容将在您的查询字符串中传递Edit
属性:
id
更好的方法是编辑routing configuration,以便将此值作为网址本身的一部分传递:
/Edit?id=1
MVC搜索参数值的过程称为模型绑定,它是MVC的最佳功能之一。您可以在模型绑定here找到更多信息。
答案 3 :(得分:4)
表单上的操作方法是否指向/controller/edit/1
?
尝试使用其中一种:
// the null in the last position is the html attributes, which you usually won't use
// on a form. These invocations are kinda ugly
Html.BeginForm("Edit", "User", new { Id = Model.Id }, FormMethod.Post, null)
Html.BeginForm(new { action="Edit", controller="User", id = Model.Id })
或在表单内添加隐藏的“Id”字段
@Html.HiddenFor(m => m.Id)
答案 4 :(得分:2)
您收到该错误,因为ASP.NET MVC无法找到id参数值来提供action方法的id参数。
您需要将其作为网址的一部分传递(“/ Home / Edit / 123”),作为查询字符串参数(“/ Home / Edit?id = 123”)或作为POSTed参数传递(make一定要在HTML表单中加上<input type="hidden" name="id" value="123" />
。
或者,您可以使id
参数成为可以为空的int(Edit(int? id, User collection) {...}
),但如果id为null,则您不知道要编辑的内容。
答案 5 :(得分:0)
以防这有助于其他任何人;如果您将“视图”作为“打开”选项卡,则Visual Studio中可能会发生此错误,该选项卡取决于参数。
关闭当前视图并启动您的应用程序,应用程序将启动&#39;正常&#39 ;;如果您打开了一个视图,Visual Studio会将其解释为您想要运行当前视图。
答案 6 :(得分:0)
只需将您的代码行更改为
即可<a href="~/Required/Edit?id=@item.id">Edit</a>
从您调用此函数的地方将传递corect id
答案 7 :(得分:0)
我有同样的错误,但对我来说,问题是我正在使用错误的GUID执行请求。我错过了最后两个角色。
360476f3-a4c8-4e1c-96d7-3c451c6c86
360476f3-a4c8-4e1c-96d7-3c451c6c865e
答案 8 :(得分:0)
如果在appconfig或webconfig中不存在属性路由,只需添加
config.MapHttpAttributeRoutes()
答案 9 :(得分:0)
我也有同样的问题。我调查后发现路由模板中缺少{action}属性。
代码之前(有问题)
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
修复后(工作代码):
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
答案 10 :(得分:0)
这对于已经正确完成所有事情的人仍然很有用。对于他们来说,“以上错误也可能由于引用不明确而引起”。
如果您的{-# LANGUAGE DataKinds, RankNTypes, PartialSignature, ScopedTypeVariables -#}
type HasApp m = (HasDatabase m, HasSmtp m)
class HasServant ...
class (HasApp m, HasServant n) => RunForUser m n where
runForUser :: Proxy (perms :: [Permission]) -> UserId -> m a -> n a
server :: forall m n . (RunForUser m n, HasApp m) => Routes (AsServerT n)
server = Routes
{ rFetchOrder = \userId orderId ->
runForUser fetchOrderPerms userId
--
-- NOTE: Had to manually annotate the type `m a` and had
-- to use PartialTypeSignatures to avoid having to specify
-- the type `a` again.
--
(fetchOrderById orderId :: m _)
, ...
}
包含
Controller
还有
using System.Web.Mvc;
它将产生歧义,默认情况下,它将使用MVC using System.Web.Http;
设置代替RouteConfig
的{{1}}设置。确保WebApiConfig
通话只需要routing
参考
答案 11 :(得分:0)
我遇到了相同的错误。
解决方案:我们将值传递给Controller的视图中的变量名称应与Controller端的变量名称匹配。
.csHtml(查看):
@Html.ActionLink("Edit", "Edit" , new { id=item.EmployeeId })
.cs(控制器方法):
[HttpGet]
public ActionResult Edit(int id)
{
EmployeeContext employeeContext = new EmployeeContext();
Employee employee = employeeContext.Employees.Where(emp => emp.EmployeeId == id).First();
return View(employee);
}
答案 12 :(得分:0)
将id参数设置为可为null的int:
public ActionResult Edit(int? id, User collection)
然后添加验证:
if (Id == null) ...