Привязать новое модальное поле в модальном asp. net основном - PullRequest
0 голосов
/ 04 августа 2020

Мой код был рабочим файлом, пока я не добавил новое поле в модальном, которое имеет только метод получения

     public bool hasShiftingRequest { 
        //this field is not in database 
        //it is being calculated everytime you access it
        get
        {                   
            return _context.AssetShifting.Where(a => a.assetId == this.Id & a.status.Equals("REQUESTED")).Any();                
        }
    }

Но это вызывает ошибку во время моего метода редактирования, который связывает переданные данные с модальным (в основном проблема во время Binding)

        public async Task<IActionResult> Edit(int id, [Bind("Id,make_model,lot,username,email")] AssetDataPc assetDataPc)

, и я получаю эту ошибку введите описание изображения здесь

Пожалуйста, помогите!

ИЗМЕНИТЬ Мой актив P C модальный

 public class AssetDataPc
{        
    public readonly AssetManagementContext _context;

    
    public AssetDataPc(AssetManagementContext context)
    {
        _context = context;
    }

    public int ram { get; set; }
    [Display(Name = "Remarks")]
    public string remarks { get; set; }
    [Display(Name = "QR Code Status")]
    public string qr_code_status { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
    [Display(Name = "Last updated")]
    public DateTime updated_at { get; set; } = DateTime.Now;
    [EmailAddress]
    [Display(Name = "Email")]
    public string email { get; set; }
    [Display(Name = "Screen Size")]
    public string screen_size { get; set; }
    [Display(Name = "Color")]

    public string rowColor { get; set; } = "";
    
    public bool hasShiftingRequest { 
        //this field is not in database 
        //it is being calculated everytime you access it
        get
        {                   
            return _context.AssetShifting.Where(a => a.assetId == this.Id & a.status.Equals("REQUESTED")).Any();                
        }
    }

}

ИЗМЕНИТЬ 2

мое редактирование (POST (метод примерно такой

 public async Task<IActionResult> Edit(int id, [Bind("remarks,qr_code_status,email")] AssetDataPc assetDataPc)
        {
 if (ModelState.IsValid)
            {              
                    assetDataPc.updated_at = DateTime.Now;
                    _context.Update(assetDataPc);
                    await _context.SaveChangesAsync();
                }

EDIT 3

Мой метод редактирования (Get):

        public async Task<IActionResult> Edit(int? id)
    {

        var assetDataPc = await _context.AssetDataPcs.FindAsync(id);
        if (assetDataPc == null)
        {
            return NotFound();
        }
        return View(assetDataPc);
    }

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Как указано в исключении, AssetDataPc должен иметь конструктор без параметров для связывания. Когда вы добавили этот конструктор

public AssetDataPc(AssetManagementContext context)
{
    _context = context;
}

, он начал давать сбой. Рассмотрите возможность перемещения hasShiftingRequest logi c за пределы класса и просто сопоставьте результат с обычным свойством.

1 голос
/ 04 августа 2020

hasShiftingRequest отсутствует в вашей базе данных?

Затем используйте [NotMapped], если вам нужно использовать дополнительный столбец без добавления этого столбца в базу данных, чтобы ядро ​​структуры сущностей не проверяло этот соответствующий столбец между классом модели и таблицей в базе данных.

[NotMapped]
public bool? hasShiftingRequest { get; set; }

Удалите AssetManagementContext из вашей модели AssetDataP c. Вот так.

public class AssetDataPc
{        
    [NotMapped]
    public bool? hasShiftingRequest { get; set; }
}

Метод редактирования «Получить»

public async Task<IActionResult> Edit(int? id)
{

    var assetDataPc = await _context.AssetDataPcs.FindAsync(id);
    if (assetDataPc == null)
    {
        return NotFound();
    }
    else
        assetDataPc.hasShiftingRequest = _context.AssetShifting.Where(a => a.assetId == assetDataPc.Id & a.status.Equals("REQUESTED")).Any();

    return View(assetDataPc);
}

Решение

- не используйте DbContext в модальных классах

- используйте [NotMapped], чтобы не создавать поля базы данных

0 голосов
/ 04 августа 2020

Как сказано в сообщении об ошибке, связанные с моделью сложные типы не должны быть абстрактными или типами значений и должны иметь конструктор без параметров. Итак, вы можете попробовать добавить конструктор AssetDataP c по умолчанию для класса AssetDataP c.

 public class AssetDataPc
{        
    public readonly AssetManagementContext _context;

    public AssetDataPc(){} //add default constructor

    public AssetDataPc(AssetManagementContext context)
    {
        _context = context;
    }
    
    ...     
    
    public bool hasShiftingRequest { 
        //this field is not in database 
        //it is being calculated everytime you access it
        get
        {                   
            return _context.AssetShifting.Where(a => a.assetId == this.Id & a.status.Equals("REQUESTED")).Any();                
        }
    }

}
...