当我在执行程序时尝试创建新的
NullReferenceException
时,我得到一个 Contract
。我在想要返回模型的方法处收到错误。但我不知道为什么,也找不到答案,因为我对编程有点陌生。
这是我的模型,我想从
CarList
模型返回计算出的价格
public class Contract
{
public int Id { get; set; }
public int CustomerId { get; set; }
public Customer Customer { get; set; }
public int CarListId{get;set;}
public CarList CarList { get; set; }
[DataType(DataType.Date)]
public DateTime AusleihDatum{ get; set; }
[DataType(DataType.Date)]
public DateTime AbgabeDatum { get; set; }
public int KilometerstandAnfang { get; set; }
public int KilometerstandEnde { get; set; }
public double GesamtPreis
{
get
{
return CarList.GesamtPreis();
}
}
}
这是
CarList
型号:
namespace MvcCar2.Models
{
public class CarList
{
public int Id { get; set; }
public string Hersteller { get; set; }
public string Modell { get; set; }
public string Kennzeichen { get; set; }
public string Farbe { get; set; }
public int Kilometerstand { get; set; }
public int CarGroupId { get; set; }
public CarGroup CarGroup { get; set; }
[NotMapped]
public int ContractId { get; set; }
public Contract Contract { get; set; }
public double GesamtPreis()
{
if (Contract.AbgabeDatum < Contract.AusleihDatum)
{
throw new InvalidOperationException("Return date is before rental date");
}
TimeSpan differenz = Contract.AbgabeDatum - Contract.AusleihDatum;
int ausleihzeit = (int)differenz.TotalDays;
double gesamtPreis1 = ausleihzeit * CarGroup.PreisTag;
return gesamtPreis1;
}
}
}
我的
ContractsController
:
namespace MvcCar2.Controllers
{
public class ContractsController : Controller
{
private readonly MvcCar2Context _context;
public ContractsController(MvcCar2Context context)
{
_context = context;
}
// GET: Contracts
public async Task<IActionResult> Index()
{
var mvcCar2Context = _context.Contract
.Include(c => c.CarList)
.Include(c => c.Customer)
.Include(c => c.CarList.CarGroup);
return View(await mvcCar2Context.ToListAsync());
}
// GET: Contracts/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null || _context.Contract == null)
{
return NotFound();
}
var contract = await _context.Contract
.Include(c => c.CarList)
.Include(c => c.Customer)
.Include(c=> c.CarList.CarGroup)
.FirstOrDefaultAsync(m => m.Id == id);
if (contract == null)
{
return NotFound();
}
return View(contract);
}
// GET: Contracts/Create
public IActionResult Create()
{
var CarListfromDB = _context.Car.ToList();
var CarListList = CarListfromDB.Select(Car => new
{
Id = Car.Id,
DisplayText1 =
$"{Car.Hersteller}-{Car.Modell}-{Car.Farbe}-{Car.Kennzeichen}-{Car.CarGroupId}"
});
ViewData["CarListId"] = new SelectList(CarListList, "Id", "DisplayText1");
var CustomerfromDB = _context.Customer.ToList();
var CustomerList = CustomerfromDB.Select(Customer => new
{
Id =Customer.Id,
DisplayText2 =
$"{Customer.Name}-{Customer.Vorname}-{Customer.EMail}-{Customer.AdressId}"
});
ViewData["CustomerId"] = new SelectList(CustomerList, "Id", "DisplayText2");
return View();
}
// POST: Contracts/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(int id, [Bind("Id,CustomerId,CarListId,AusleihDatum,AbgabeDatum,GesamtPreis,KilometerstandAnfang,KilometerstandEnde")] Contract contract)
{
//if (ModelState.IsValid)
//{
_context.Add(contract);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
//}
var CarListfromDB = _context.Car.ToList();
var CarListList = CarListfromDB.Select(Car => new
{
Id = Car.Id,
DisplayText1 =
$"{Car.Hersteller}---{Car.Modell}---{Car.CarGroupId}---{Car.Kennzeichen}---{Car.Farbe}"
});
ViewData["CarListId"] = new SelectList(CarListList, "Id", "DisplayText1");
var CustomerfromDB = _context.Customer.ToList();
var CustomerList = CustomerfromDB.Select(Customer => new
{
Id = Customer.Id,
DisplayText2 =
$"{Customer.Name}---{Customer.Vorname}---{Customer.EMail}---{Customer.AdressId}"
});
ViewData["CustomerId"] = new SelectList(CustomerList, "Id", "DisplayText2");
return View(contract);
}
// GET: Contracts/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null || _context.Contract == null)
{
return NotFound();
}
var contract = await _context.Contract.FindAsync(id);
if (contract == null)
{
return NotFound();
}
var CarListfromDB = _context.Car.ToList();
var CarListList = CarListfromDB.Select(Car => new
{
Id = Car.Id,
DisplayText1 =
$"{Car.Hersteller}---{Car.Modell}---{Car.CarGroupId}---{Car.Kennzeichen}---{Car.Farbe}"
});
ViewData["CarListId"] = new SelectList(CarListList, "Id", "DisplayText1", contract.CarListId);
var CustomerfromDB = _context.Customer.ToList();
var CustomerList = CustomerfromDB.Select(Customer => new
{
Id = Customer.Id,
DisplayText2 =
$"{Customer.Name}---{Customer.Vorname}---{Customer.EMail}---{Customer.AdressId}"
});
ViewData["CustomerId"] = new SelectList(CustomerList, "Id", "DisplayText2", contract.CustomerId);
return View(contract);
}
// POST: Contracts/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,CustomerId,CarListId,AusleihDatum,AbgabeDatum,GesamtPreis,KilometerstandAnfang,KilometerstandEnde")] Contract contract)
{
if (id != contract.Id)
{
return NotFound();
}
//if (ModelState.IsValid)
//{
try
{
_context.Update(contract);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!ContractExists(contract.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
//}
var CarListfromDB = _context.Car.ToList();
var CarListList = CarListfromDB.Select(Car => new
{
Id = Car.Id,
DisplayText1 =
$"{Car.Hersteller}---{Car.Modell}---{Car.CarGroupId}---{Car.Kennzeichen}---{Car.Farbe}"
});
ViewData["CarListId"] = new SelectList(CarListList, "Id", "DisplayText1", contract.CarListId);
var CustomerfromDB = _context.Customer.ToList();
var CustomerList = CustomerfromDB.Select(Customer => new
{
Id = Customer.Id,
DisplayText2 =
$"{Customer.Name}---{Customer.Vorname}---{Customer.EMail}---{Customer.AdressId}"
});
ViewData["CustomerId"] = new SelectList(CustomerList, "Id", "DisplayText2", contract.CustomerId);
return View(contract);
}
// GET: Contracts/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null || _context.Contract == null)
{
return NotFound();
}
var contract = await _context.Contract
.Include(c => c.CarList)
.Include(c => c.Customer)
.Include (c => c.CarList.CarGroup)
.FirstOrDefaultAsync(m => m.Id == id);
if (contract == null)
{
return NotFound();
}
return View(contract);
}
// POST: Contracts/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
if (_context.Contract == null)
{
return Problem("Entity set 'MvcCar2Context.Contract' is null.");
}
var contract = await _context.Contract.FindAsync(id);
if (contract != null)
{
_context.Contract.Remove(contract);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
private bool ContractExists(int id)
{
return (_context.Contract?.Any(e => e.Id == id)).GetValueOrDefault();
}
}
}
我的
CarListController
:
namespace MvcCar2.Controllers
{
public class CarListsController : Controller
{
private readonly MvcCar2Context _context;
public CarListsController(MvcCar2Context context)
{
_context = context;
}
// GET: CarLists
public async Task<IActionResult> Index()
{
var mvcCar2Context = _context.Car.Include(c => c.CarGroup);
return View(await mvcCar2Context.ToListAsync());
}
// GET: CarLists/Details/5
public async Task<IActionResult> Details(int? id)
{
if (id == null || _context.Car == null)
{
return NotFound();
}
var carList = await _context.Car
.Include(c => c.CarGroup)
.FirstOrDefaultAsync(m => m.Id == id);
if (carList == null)
{
return NotFound();
}
return View(carList);
}
// GET: CarLists/Create
public IActionResult Create()
{
var CarGroupfromDB = _context.CarGroup.ToList();
var CarGroupList = CarGroupfromDB.Select(CarGroup => new
{
Id = CarGroup.Id,
DisplayText = $"{CarGroup.Klasse}-{CarGroup.PreisTag}"
});
ViewData["CarGroupId"] = new SelectList(CarGroupList, "Id", "DisplayText");
return View();
}
// POST: CarLists/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Hersteller,Modell,Kennzeichen,Farbe,Kilometerstand,CarGroupId")] CarList carList)
{
//if (ModelState.IsValid)
//{
_context.Add(carList);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
//}
var CarGroupfromDB = _context.CarGroup.ToList();
var CarGroupList = CarGroupfromDB.Select(CarGroup => new
{
Id = CarGroup.Id,
DisplayText =
$"{CarGroup.Klasse}-{CarGroup.PreisTag}"
});
ViewData["CarGroupId"] = new SelectList(CarGroupList, "Id", "DisplayText");
return View(carList);
}
// GET: CarLists/Edit/5
public async Task<IActionResult> Edit(int? id)
{
if (id == null || _context.Car == null)
{
return NotFound();
}
var carList = await _context.Car.FindAsync(id);
if (carList == null)
{
return NotFound();
}
var CarGroupfromDB = _context.CarGroup.ToList();
var CarGroupList = CarGroupfromDB.Select(CarGroup => new
{
Id = CarGroup.Id,
DisplayText =
$"{CarGroup.Klasse}-{CarGroup.PreisTag}"
});
ViewData["CarGroupId"] = new SelectList(CarGroupList, "Id", "DisplayText", carList.CarGroupId);
return View(carList);
}
// POST: CarLists/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, [Bind("Id,Hersteller,Modell,Kennzeichen,Farbe,Kilometerstand,CarGroupId")] CarList carList)
{
if (id != carList.Id)
{
return NotFound();
}
//if (ModelState.IsValid)
//{
try
{
_context.Update(carList);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CarListExists(carList.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
//}
var CarGroupfromDB = _context.CarGroup.ToList();
var CarGroupList = CarGroupfromDB.Select(CarGroup => new
{
Id = CarGroup.Id,
DisplayText =
$"{CarGroup.Klasse}-{CarGroup.PreisTag}"
});
ViewData["CarGroupId"] = new SelectList(CarGroupList, "Id", "DisplayText", carList.CarGroupId);
return View(carList);
}
// GET: CarLists/Delete/5
public async Task<IActionResult> Delete(int? id)
{
if (id == null || _context.Car == null)
{
return NotFound();
}
var carList = await _context.Car
.Include(c => c.CarGroup)
.FirstOrDefaultAsync(m => m.Id == id);
if (carList == null)
{
return NotFound();
}
return View(carList);
}
// POST: CarLists/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
if (_context.Car == null)
{
return Problem("Entity set 'MvcCar2Context.Car' is null.");
}
var carList = await _context.Car.FindAsync(id);
if (carList != null)
{
_context.Car.Remove(carList);
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
private bool CarListExists(int id)
{
return (_context.Car?.Any(e => e.Id == id)).GetValueOrDefault();
}
}
}
以及我从中获取价格的
CarGroup
型号:
namespace MvcCar2.Models
{
public class CarGroup
{
public int Id { get; set; }
public string Klasse { get; set; }
public double PreisTag { get; set; }
}
}
所以我想做的是计算
CarList
模型中的价格。该模型根据 Cargroup
从 CarGroup
模型中获取价格,然后将计算出的价格返回到 ContractController
中,因此它将显示在 ContractsController
的表格中。
由于没有调试详细信息,我可以给你一个可能的原因。
合约模型调用carlist来获取price属性,但是在创建时,模型并没有绑定carlist,所以总是会抛出NullReferenceException。你可以按照我的样品来检查。
- 您的合同引用了客户和汽车列表,将属性设置为可为空。并检查价格。
Contract.cs
using System.ComponentModel.DataAnnotations;
namespace YourNamespace.Models
{
public class Contract
{
public int Id { get; set; }
//1.to be nullable
public int CustomerId { get; set; }
public Customer? Customer { get; set; }
public int CarListId { get; set; }
public CarList? CarList { get; set; }
[DataType(DataType.Date)]
public DateTime AusleihDatum { get; set; }
[DataType(DataType.Date)]
public DateTime AbgabeDatum { get; set; }
public int KilometerstandAnfang { get; set; }
public int KilometerstandEnde { get; set; }
public double GesamtPreis
{
get
{
//2.add the logic to avoid nullreference
return CarList != null ? CarList.GesamtPreis() : 0;
}
}
}
}
- 您的创建操作不应再绑定价格
ContractsController
// POST: Contracts/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(int id, [Bind("Id,CustomerId,CarListId,AusleihDatum,AbgabeDatum,KilometerstandAnfang,KilometerstandEnde")] Contract contract)
{
// 1.The modelstate will be invalid if the customer and carlist are not nullable
if (ModelState.IsValid)
{
_context.Add(contract);
await _context.SaveChangesAsync();
//2.Here you can get the price and it will be bound to model
//3.Include will connect the reference model in efcore
var SavedContract = await _context.Contract
.Include(c => c.CarList)
.Include(c => c.Customer)
.Include(c => c.CarList.CarGroup)
.FirstOrDefaultAsync(C => C.CarListId == contract.CarListId);
var gesamtPreis = SavedContract.GesamtPreis;
return RedirectToAction(nameof(Index));
}
var CarListfromDB = _context.Car.ToList();
var CarListList = CarListfromDB.Select(Car => new
{
Id = Car.Id,
DisplayText1 =
$"{Car.Hersteller}---{Car.Modell}---{Car.CarGroupId}---{Car.Kennzeichen}---{Car.Farbe}"
});
ViewData["CarListId"] = new SelectList(CarListList, "Id", "DisplayText1");
var CustomerfromDB = _context.Customer.ToList();
var CustomerList = CustomerfromDB.Select(Customer => new
{
Id = Customer.Id,
DisplayText2 =
$"{Customer.Name}---{Customer.Vorname}---{Customer.EMail}---{Customer.AdressId}"
});
ViewData["CustomerId"] = new SelectList(CustomerList, "Id", "DisplayText2");
return View(contract);
}
3.由于您不向客户提供报价,请确保参考信息正确
Customer.cs
namespace YourNamespace.Models
{
public class Customer
{
public int Id { get; set; }
public string? Vorname { get; set; }
public string? Name { get; set; }
public string? EMail { get; set; }
public int AdressId { get; set; }
public Contract? Contract { get; set; }
}
}
现在将提供价格。
测试