ASP.NET Core MVC:返回另一个模型中的方法

问题描述 投票:0回答:1

当我在执行程序时尝试创建新的

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
的表格中。

c# asp.net-core-mvc
1个回答
0
投票

由于没有调试详细信息,我可以给你一个可能的原因。

合约模型调用carlist来获取price属性,但是在创建时,模型并没有绑定carlist,所以总是会抛出NullReferenceException。你可以按照我的样品来检查。

  1. 您的合同引用了客户和汽车列表,将属性设置为可为空。并检查价格。
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;
            }
        }
    }
}
  1. 您的创建操作不应再绑定价格
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; }
    }
}

现在将提供价格。

测试

© www.soinside.com 2019 - 2024. All rights reserved.