2016-06-17 55 views
1

我有一個模型費用模型ID屬性空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); 
} 

然後控制器方法用戶可以設置費用名稱屬性,我已包含

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

然後另一個控制器方法接受費用模型a第二應該把它保存到數據庫然而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

您是否調試過動作創建?在這裏你看到,當你創建費用對象的行爲創建你只是初始化reportid不是費用ID。和@ Html.HiddenFor(model => model.expenseID)除null外沒有任何值。 –

+0

從我可以看到的是,您只通過'Expense ex'對象中的'reportID'並返回到View。然後在你的視圖中設置一個'HiddenFor(model => model.expenseID),它沒有任何內容。我認爲這是你面臨的問題。 –

+1

在將GET ActionResult方法傳遞給視圖之前,您正在創建對象Expense的新實例。但它看起來像你沒有一個構造函數來爲模型實例化分配一個ID。如果您希望數據庫在插入時分配ID,您需要在該屬性上將Identity Specification設置爲true,否則將嘗試插入沒有主鍵的行。你是否使用實體框架進行數據訪問,如果你是這樣的話,這可能更像是一個EF配置問題。 – JsonStatham

回答

0

expenseID屬性爲null。因爲您將屬性expenseID設置爲空,並且您在database =>錯誤中插入了expenseID = null。而模型的費用則需要再次更新相同的是:

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

和物業expenseID在數據庫中,如果你不設置「標識規範」 => expenseID不會自動有新的密鑰ID。

+0

請嘗試瞭解問題。 –

+1

我認爲他的問題,它在這樣的內容:)。你認爲? –

+0

@LinhTuan添加'[Key]'只能部分地解決問題,OP需要的是在將@ID.html.HiddenFor傳遞給View之前填入費用ID。 –

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"> 
} 

你有設置在創建操作方法中設置斷點,以確保該費用模型絕對不是空本身,當它到來時,如果它不是那麼我的上面的建議應該修復它。

編輯 這是假設當你通過它你的看法擺在首位您的ID被填充,且尚未在分貝實際上創建爲靈疃建議。

如果使用的是EF,你應該確保你的配置是這樣的:

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

您應該檢查該表的設計,看看標識規格是否設置爲true,如果是,不要緊的expenseId是否爲空一路INSERT,該數據庫將爲其分配一個遞增ID一旦得到它插入點。

你的GET方法似乎期待一個reportId作爲參數,你能告訴我們什麼是第一個給這個ActionMethod餵食,就好像你已經有了一個你想要重複用於你的Expense對象表的ID那麼它可能只是第一個沒有正確傳遞HiddenFor屬性的情況。

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;} 
} 
0

添加[HttpPost]屬性到第二個ActionMethod.And參數必須是「費用模型」

+1

只要您將具有相同類型的對象傳遞給控制器​​,該參數不需要專門指定爲「費用模型」。 –

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); 
} 
0

您可以通過兩種方式解決這個問題。

1.從創建方法你不發送任何費用ID到視圖通過模型。您必須在操作方法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); 
+0

問題是我們不知道什麼是用於數據訪問,這是與EF相關的代碼,作爲旁註,我認爲像這樣的東西屬於存儲庫層,而不是控制器。 – JsonStatham

+0

嗯,我只是讓方向得到ex.expenseId,以便他可以去正確的地方.. :) –

0

你將不得不要麼通過expenseID屬性值,同時創造新的紀錄。 否則你可以通過將它包含在你的上下文類中來使costid成爲標識列。

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); 
     } 
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爲您的主鍵,因此EF將計算適當的Id當你設置expenseID = 0