ASP.NET MVC中的模型ID属性null#

时间:2016-06-17 09:00:35

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

我有模特费用

public class Expense
{
     public int expenseID {get;set;}
     public string expenseName {get;set;}
     public int reportID {get;set;}
}

我有一个控制器方法,它应该将一个费用对象传递给视图

public ActionResult Create(int reportID)
{
    Expense ex = new Expense(){ 
        reportID = reportID
    };
    return View(ex);
}

然后在视图中,用户可以设置expenseName属性,我已经包含了

@Html.HiddenFor(model => model.expenseID)
@Html.HiddenFor(model => model.reportID)

然后另一个控制器方法接受Expense模型并应将其保存到数据库,但是expenseID为null并且发生数据库错误 这是控制器方法

public ActionResult Create(Expense ex)
{
    if(ModelState.IsValid)
    {
        db.Expenses.Add(ex);
        db.SaveChanges();
        return RedirectToAction("Index");
   }
   return View(ex);
}

当我们尝试将费用添加到我们的数据库时,有人可以建议为什么expenseID属性为null!

9 个答案:

答案 0 :(得分:0)

expenseID属性为null。因为您将属性expenseID设置为null并且您在database =>中插入expenseID = null;错误。和模型费用你需要再次更新:

public class Expense
{
     [Key]
     public int expenseID {get;set;}
     public string expenseName {get;set;}
     public int reportID {get;set;}
}
如果您没有设置"身份规范"

数据库中的属性费用ID => expenseID不要自动拥有新的密钥ID。

答案 1 :(得分:0)

确保HiddenFor属性在您的BeginForm中使用语句:

@using (Html.BeginForm("Create", "YourController", FormMethod.Post))
{
    @Html.HiddenFor(model => model.expenseID)
    @Html.HiddenFor(model => model.reportID)

    <input class="btn btn-default" type="submit" value="Post Data">
}

您是否在创建操作方法上设置了一个断点,以确保Expense模型在到达时绝对不是null,如果不是那么我的上述建议应该修复它。

修改 这假设您的ID在首先传递给您的视图时已填充,并且尚未在Linh Tuan建议的数据库中实际创建。

如果您使用EF,则应确保您的配置是这样的:

public ExpenseConfiguration()
{
    HasKey(x => x.expenseId);
}

您应该检查该表的设计,并查看Identity Specification是否设置为true,如果是,则expenseId一直是否为INSERT无关紧要,db将分配一旦到达插入点,它就是一个递增的ID。

您的GET方法似乎期望将reportId作为参数,您能否首先告诉我们这个ActionMethod的内容是什么,就好像您已经拥有一个您希望重新使用它的ID一样费用对象表然后可能只是首先没有正确传递HiddenFor属性。

答案 2 :(得分:0)

除非在您的数据库和映射中将expenseID设置为标识列,否则您必须明确设置expenseID。

这样的事情:

public ActionResult Create(int reportID)
{
    Expense ex = new Expense(){ 
        reportID = reportID,
        expenseID = **Some value** //Not advisable though

    };
    return View(ex);
}

但是,首选方法是将expenseId列作为标识列并使其自动递增,如下所示:

public class Expense
{
     [Key]
     public int expenseID {get;set;}
     public string expenseName {get;set;}
     public int reportID {get;set;}
}

答案 3 :(得分:0)

将[HttpPost]属性添加到第二个ActionMethod.And参数必须是“费用模型”

答案 4 :(得分:0)

我的隐藏字段是内部形式。

<强>型号:

public class Operations
{        
    public decimal firstValue { get; set; }        
}

第一行动方法:

[HttpGet]
public ActionResult Index()
{
    Operations model = new Operations();
    model.firstValue = 100M;
    return View(model);
}

查看:

@Html.HiddenFor(m => m.firstValue)
@Html.ActionLink("MyLink", "SampleGet", Model)//(for redirection)

目标行动方法:

[HttpGet]
public ActionResult SampleGet(Operations model)
{
    decimal myValue = model.firstValue;
    return View(model);
}

答案 5 :(得分:0)

您可以通过两种方式解决此问题。

1。从create方法中,您不会通过模型向视图发送任何expenseID。您必须在操作方法Create。

中初始化ex.expenseID
   public ActionResult Create(int reportID, int expenseID )
    {
        Expense ex = new Expense(){ 
            reportID = reportID,
            expenseID = expenseID /** Or expenseID = max(expenseID) +1 from expense table in database*/  
        };
        return View(ex);
    }

<强> 2。或者在回发创建方法

public ActionResult Create(Expense ex)
{
    if(ModelState.IsValid)
    {
        ex.expenseID = db.Expenses.Max( x => x.expenseID) + 1 ; 
        db.Expenses.Add(ex);
        db.SaveChanges();
        return RedirectToAction("Index");
   }
   return View(ex);

答案 6 :(得分:0)

创建新记录时,您必须传递expenseID属性值。 否则你可以通过在Context类中包含它来将expenseid作为标识列。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {           

            modelBuilder.Entity<Models.Expense>().HasKey(a => a.expenseID);
            modelBuilder.Entity<Models.Expense>().Property(a => a.expenseID).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);

            base.OnModelCreating(modelBuilder);
        }

答案 7 :(得分:0)

您必须明确初始化expenseID

是的,我知道,我们可以预期int将使用0初始化 - 但在我的情况下,当您传递对象controller -> view (with hidden) -> controller时它不起作用。我不确定为什么。

尝试类似的东西:

public ActionResult Create(int reportID)
{
    Expense ex = new Expense(){ 
        expenseID = 0,
        reportID = reportID,
    };
    return View(ex);
}


我认为expenseID是您在Db中的主键,因此当您设置Id时,EF会计算正确的expenseID = 0

答案 8 :(得分:0)

如果expenseID是您的密钥,则应在

之前使用这两行修改代码
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
public int expenseID {get;set;}