[英]Model ID property null in ASP.NET MVC c#
我有模特費用
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謝謝!
expenseID屬性為null。 因為您將屬性expenseID設置為null並且在database => error中插入expenseID = null。 和模型費用你需要再次更新相同:
public class Expense
{
[Key]
public int expenseID {get;set;}
public string expenseName {get;set;}
public int reportID {get;set;}
}
如果不設置“Identity Specification”=> expenseID,則數據庫中的屬性expenseID不會自動擁有新的密鑰ID。
確保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
是否expenseId
是空的expenseId
,一旦獲得,db將為它分配一個遞增的ID到插入點。
您的GET方法似乎期望將reportId作為參數,您能否首先告訴我們這個ActionMethod
的內容,就好像您已經有一個ID,您希望為您的Expense對象表重用它然后它可能只是是一個沒有正確傳遞HiddenFor
屬性的情況。
除非在數據庫和映射中將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;}
}
將[HttpPost]屬性添加到第二個ActionMethod.And參數必須是“Expense model”
我隱藏的領域是內部形式。
模型:
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);
}
您可以通過兩種方式解決此問題。
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.或者在post back create方法中
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);
您必須在創建新記錄時傳遞expenseID屬性值。 否則,您可以將expenseid作為標識列,將其包含在Context類中。
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);
}
您必須明確初始化您的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中的主鍵,因此當您設置expenseID = 0
時,EF將計算正確的Id
。
如果expenseID是您的密鑰,您應該使用這兩行修改您的代碼
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None)]
public int expenseID {get;set;}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.