繁体   English   中英

在 asp.net 核心模态绑定新模态域

[英]Bind new modal field in asp.net core modal

我的代码是工作文件,直到我在模态中添加了一个只有 get 方法的新字段

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

但它在我的编辑方法中导致错误,该方法将前端数据与模态绑定(基本上是绑定期间的问题)

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

我收到了这个错误在此处输入图像描述

请帮忙 !

编辑我的 assetPC 模态

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

编辑 3

我的编辑(获取)方法:

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

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

hasShiftingRequest 不在你的数据库中?

如果您需要使用额外的列而不在数据库中添加此列,则使用 [NotMapped],这样实体框架核心将不会检查 model class 与数据库中的表之间的匹配列。

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

从您的 AssetDataPc model 中删除 AssetManagementContext。像这样。

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] 避免创建数据库字段

由于异常状态AssetDataPc应该有一个无参数的构造函数才能被绑定。 当您添加此构造函数时

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

它开始失败。 考虑将 class 和 map 结果之外的hasShiftingRequest逻辑移动到普通属性。

如错误消息所述,Model 绑定的复杂类型不能是抽象类型或值类型,并且必须具有无参数构造函数。 因此,您可以尝试为 AssetDataPc class 添加默认的 AssetDataPc 构造函数。

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM