簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM