使用MVC 5列表删除问题

时间:2015-08-13 08:55:46

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

最近花了一些时间远离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");
        }

1 个答案:

答案 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