最近花了一些时间远离MVC并回到一个旧项目,尝试重新编写我以前做过的代码,但是在删除列表中的项目时已经解开,使用EF它很好但是我正在尝试不使用Entity Framework来管理我的模型数据。我想将我的模型用作数据库,直到我很高兴提交。
我重写了这个问题以简化它并且不会转储大量代码,当点击删除时我收到以下错误:
参数字典包含非可空类型'System.Int32'的参数'id'的空条目,用于'Project.Views.requestedController中的方法'System.Web.Mvc.ActionResult RemoveRequested(Int32)' ”。可选参数必须是引用类型,可空类型,或者声明为可选参数。 参数名称:参数
我认为id通常由EF处理,但我认为[key]
会处理这个以自动递增 - 这可以排序吗?
希望这是有道理的。动态我真的不在乎,所以理想情况下没有jQuery / java脚本,除非我必须这样做。
代码:
部分视图
@model IEnumerable<Project.Models.Allocation>
@using (Html.BeginForm())
{
if (Model != null)
{
foreach (var ri in Model)
{
<div class="ui-grid-c ui-responsive">
<div class="ui-block-a">
<span>
@ri.one
</span>
</div>
<div class="ui-block-b">
<span>
@ri.two
</span>
</div>
<div class="ui-block-c">
<span>
@ri.three
</span>
</div>
<div class="ui-block-d">
<span>
@Html.ActionLink("Delete", "RemoveRequested", new { id = ri.id })
</span>
</div>
</div>
}
}
模型
public class Allocation
{
[Key]
public int? id { get; set; }
[Required]
public string one { get; set; }
[Required]
public string two { get; set; }
[Required]
public string three { get; set; }
}
public class Container
{
[key]
public int? id { get;set; }
[Required]
public List<Allocation> requested { get;set; }
}
控制器操作方法
public ActionResult RemoveRequested(int id)
{
var newContainer = (Container)Session["containerSession"];
if(newAllocation.requested != null)
{
var del = newContainer.requested.Find(m => m.id == id);
newContainer.requested.Remove(del);
}
Session["containerSession"] = newContainer;
return RedirectToAction("Index");
}
答案 0 :(得分:2)
我没有可以为空的密钥并添加$ ruby --version
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
$ passenger --version
Phusion Passenger version 5.0.15
属性。
将您的[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
类型更改为:
Allocation
这将与您的动作参数匹配。 但是,如果您的密钥为null,则必须有其他问题,现在它们将使用默认值零。
另一种选择是将您的操作更改为接受可空类型作为参数:
public class Allocation
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
[Required]
public string one { get; set; }
[Required]
public string two { get; set; }
[Required]
public string three { get; set; }
}
请注意,我还会使用public ActionResult RemoveRequested(int? id)
来删除而不是正在进行的HttpPost
。