2016-06-17 3 views
1

У меня есть модель счетМодель свойство ИД нуль в 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); 
} 

Тогда в представлении пользователь может установить свойство расходName, и я включил

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

Затем другой метод контроллера принимает модель Expense a й должен сохранить его в базу данных, однако ExpenseID является недействительным и ошибка базы данных происходит Это метод контроллера

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

Можно ли предположить, почему свойство ExpenseID равно нулю, когда мы пытаемся добавить счет в нашей базе спасибо!

+0

Вы отлаживали действие Create? И здесь вы видите, когда вы создаете объект расходов в действии Create, вы просто инициализируете reportid, а не indexId. И @ Html.HiddenFor (model => model.expenseID) не имеют никакого значения, кроме null. –

+0

Из того, что я вижу, является то, что вы переходите только в 'reportID' в' Expense ex' и возвращаетесь в View. Затем, по вашему мнению, вы устанавливаете 'HiddenFor (model => model.expenseID), который ничего не имеет в нем. Я думаю, что это проблема, с которой вы сталкиваетесь. –

+1

Вы создаете новый экземпляр объекта Expense перед тем, как передать его в свое представление в методе GET ActionResult. Но похоже, что у вас нет конструктора для назначения идентификатора для экземпляра модели. Если вы хотите, чтобы база данных назначала идентификатор при вставке, вы должны установить значение Идентификационная спецификация для этого свойства, иначе он попытается вставить строку без первичного ключа. Используете ли вы Entity Framework для доступа к данным, это может быть скорее проблемой конфигурации EF, если вы есть. – JsonStatham

ответ

0

расходыID свойство - null. Поскольку вы устанавливаете значение propertyIDID не null, и вы вставляете значение costID = null в базу данных => ошибка. И модель расходов вам необходимо обновить снова же, что:

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

И Property ExpenseID в базе данных, если не установить «Удостоверение Specification» => ExpenseID не автоматически иметь новый идентификатор ключа.

+0

Пожалуйста, постарайтесь понять проблему. –

+1

Думаю, его проблема, это в таком содержании :). вы думаете? –

+0

@LinhTuan Добавление '[Key]' может только частично решить проблему, то, что требуется OP, заключается в том, что значение answerID заполняется перед переходом к представлению как @ Html.HiddenFor. –

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

Вы установить контрольную точку на Create Action Method, чтобы убедиться, что модель расходов, безусловно, не равно нулю сам, когда он приходит, если его не тогда мое предложение выше должно исправить это.

редактировать Это предполагает, что ваш ID заполняется при передаче его на ваш взгляд, в первую очередь, и еще не быть на самом деле создан в БД, как предложил Linh Туан.

Если вы используете EF, вы должны убедиться, что ваш конфиг что-то вроде этого:

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

Вы должны проверить дизайн этой таблицы, и посмотреть, является ли спецификация идентификации установлена ​​верно, если , не имеет значения, имеет ли значение expenseId значение NULL до INSERT, db назначит ему инкрементирующий идентификатор, как только он достигнет точки вставки.

Ваш метод GET, кажется, ожидает отчета как параметр, не могли бы вы рассказать нам, что кормит этот ActionMethod в первую очередь, как будто у вас уже есть идентификатор, который вы хотите использовать повторно для своей таблицы объектов Expense то это может быть просто случай, когда вы неправильно передаете свойство HiddenFor.

0

Если expenseID не установлен в качестве столбца Identity Column в вашей базе данных и для сопоставления, вам придется явно указывать значение расхода.

Что-то вроде этого:

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

Параметр не обязательно должен быть специально «Expense model», если вы передаете объект с тем же типом в контроллер. –

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

Вы можете решить эту проблему в 2-х направлениях.

1. Из метода создания вы не отправляете какой-либо расходID в вид через модель. Вы должны инициализировать ex.expenseID в методе действия Create.

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 свойства при создании новой записи. . Кроме того, вы можете сделать reportid как столбец идентификации, включив это в свой класс контекста.

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 ваш первичный ключ в Дб, поэтому EF рассчитает правильную Id при установке expenseID = 0.

Смежные вопросы