我有模特费用
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!
答案 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;}