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