Member 14615938 Ответов: 3

Asp.net ошибка core3: не все пути кода возвращают значение


I have two tables with similar data for body insurance and third party car insurance ... I have used enum in the model to separate the insurances and I want to do the creation operation for it .... There are two modes for each insurance. One case when that car does not have insurance yet and the second case when we want to extend it. I wrote this code to create the form, but it encounters the following error I also get an error on the name of the Create function.error = not all code paths return a value. Please advise


Что я уже пробовал:

public async Task<IActionResult> Create(int id, int type)
    {
        InsuranceViewModel model;
        ViewBag.Type = type;

        var companies = await _context.InsuranceCompany
            .Where(e => e.IsActice)
            .ToListAsync();
        ViewData["CompanyList"] = new SelectList(companies, "Id", "CompanyName");

        if ((InsuranceType)type == InsuranceType.Body)
        {
            var bodyInsurance = await _context.BodyInsurance
           .Include(e => e.InsuranceCompany)
           .FirstOrDefaultAsync(e => e.Id == id);

            if (bodyInsurance == null)
            {
                model = new InsuranceViewModel
                {
                    CompanyId = bodyInsurance.InsuranceCompanyId,
                    CompanyName = bodyInsurance.InsuranceCompany.CompanyName,
                    InsuranceType = InsuranceType.Body,
                    IssueDate = new DateTime(bodyInsurance.IssueDate).Ticks,
                    ExpireDate = new DateTime(bodyInsurance.ExpireDate).Ticks,

                    VehicleInformationId = id
                };
            }
            else
            {
                var lastBody = await _context.BodyInsurance.Include(e => e.InsuranceCompany)
                        .Where(e => e.VehicleInformationId == id)
                        .OrderBy(e => e.ExpireDate)
                        .LastAsync();
                model = new InsuranceViewModel
                {
                    ExpireDate = new DateTime(lastBody.ExpireDate).AddYears(1).AddDays(1).Ticks,
                    CompanyId = lastBody.InsuranceCompanyId,
                    CompanyName = lastBody.InsuranceCompany.CompanyName,
                    InsuranceType = InsuranceType.Body,
                    IssueDate = new DateTime(lastBody.ExpireDate).AddDays(1).Ticks,
                    VehicleInformationId = id
                };

            }
        }
        else
        {
            if ((InsuranceType)type == InsuranceType.Thirdpart)
            {
                var thirdParty = await _context.ThirdPartyInsurance
                   .Include(e => e.InsuranceCompany)
                   .FirstOrDefaultAsync(e => e.Id == id);

                if (thirdParty == null)
                {
                    model = new InsuranceViewModel
                    {
                        CompanyId = thirdParty.InsuranceCompanyId,
                        CompanyName = thirdParty.InsuranceCompany.CompanyName,
                        InsuranceType = InsuranceType.Body,
                        IssueDate = new DateTime(thirdParty.IssueDate).Ticks,
                        ExpireDate = new DateTime(thirdParty.ExpireDate).Ticks,
                        VehicleInformationId = id
                    };
                }

                else
                {
                    var lastThirdParty = await _context.ThirdPartyInsurance.Include(e => e.InsuranceCompany)
                         .Where(e => e.VehicleInformationId == id)
                         .OrderBy(e => e.ExpireDate)
                         .LastAsync();
                    model = new InsuranceViewModel
                    {
                        ExpireDate = new DateTime(lastThirdParty.ExpireDate).AddYears(1).AddDays(1).Ticks,
                        CompanyId = lastThirdParty.InsuranceCompanyId,
                        CompanyName = lastThirdParty.InsuranceCompany.CompanyName,
                        InsuranceType = InsuranceType.Body,
                        IssueDate = new DateTime(lastThirdParty.ExpireDate).AddDays(1).Ticks,
                        VehicleInformationId = id
                    };

                }
            }

            return View(model);
        }

3 Ответов

Рейтинг:
12

Member 14615938

// GET: VehicleInformations/Create
public IActionResult Create()
{

    var typelistdocumentstatus = _context.DocumentStatus.ToList();
    typelistdocumentstatus.Insert(0, new DocumentStatus { Id = -1, Status = "انتخاب کنید" });
    ViewData["DocumentStatusId"] = new SelectList(typelistdocumentstatus, "Id", "Status");

    var typelistoffice = _context.Office.ToList();
    typelistoffice.Insert(0, new Office { Id = -1, Name = "انتخاب کنید" });
    ViewData["OfficeId"] = new SelectList(typelistoffice, "Id", "Name");

    var typelistunit = _context.Unit.ToList();
    typelistunit.Insert(0, new Unit { Id = -1,UnitName = "انتخاب کنید" });
    ViewData["UnitId"] = new SelectList(typelistunit, "Id", "UnitName");

    var typelistsvehicletype = _context.VehicleType.ToList();
    typelistsvehicletype.Insert(0, new VehicleType { Id = -1, TypeName = "انتخاب کنید" });
    ViewData["VehicleTypeId"] = new SelectList(typelistsvehicletype, "Id", "TypeName");

    return View();
}

// POST: VehicleInformations/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,VehicleTypeId,UnitId,VehicleColor,Vin,EngineNumber,NumberPlate,DocumentStatusId,OfficeId,OwnerStatus,OwnerName,Description")] VehicleInformation vehicleInformation)
{
    if (ModelState.IsValid)
    {
        _context.Add(vehicleInformation);
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));
    }
    ViewData["DocumentStatusId"] = new SelectList(_context.DocumentStatus, "Id", "Status", vehicleInformation.DocumentStatusId);
    ViewData["OfficeId"] = new SelectList(_context.Office, "Id", "Name", vehicleInformation.OfficeId);
    ViewData["UnitId"] = new SelectList(_context.Unit, "Id", "UnitName", vehicleInformation.UnitId);
    ViewData["VehicleTypeId"] = new SelectList(_context.VehicleType, "Id", "TypeName", vehicleInformation.VehicleTypeId);
    return View(vehicleInformation);
}


Рейтинг:
0

Garth J Lancaster

Ну, это ужасно выраженная логика - я бы разделил ваши if-elses на ?4 случая, в худшем случае используя переключатель, в лучшем случае используя отдельные процедуры

Я подозреваю, что проблема заключается в том, что ваши два "основных" условия if-else являются

if ((InsuranceType)type == InsuranceType.Body)
и это нижний блок "еще", в нижнем блоке " еще " вы
return View(model);
но ты этого не сделаешь для верха
if ((InsuranceType)type == InsuranceType.Body)
блок

Если бы код был устроен более красиво, вы бы это увидели, но сейчас это трудно заметить


Member 14615938

Я должен рассматривать 4 режима для страховой орган два раза и страховка ответственности перед третьими лицами дважды

Garth J Lancaster

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

Member 14615938

У вас есть лучшее решение?

Garth J Lancaster

Ну, во-первых, всегда нужно заставить его работать ... добавить недостающее

return View(model); 
так что верхний блок имеет его, т. е.
        if ((InsuranceType)type == InsuranceType.Body)
        {
            var bodyInsurance = await _context.BodyInsurance
           .Include(e => e.InsuranceCompany)
           .FirstOrDefaultAsync(e => e.Id == id);

            if (bodyInsurance == null)
            {
                 …
            }
            else
            {
                 …
            }
            return View(model);    // Missing return !!!!
        }
        else
и оставь пока остальную часть кода. Я отправлю сообщение позже с более чистым вариантом

Member 14615938

Я столкнулся с этой ошибкой, когда я добавил код
ошибка: ambigupus match исключение : запрос совпал с несколькими конечными точками

Garth J Lancaster

извините, я не знаю, что там происходит - я не знаю, как "просто" добавить отсутствующий возвращаемый вид(модель); оператор для исправления первой ошибки может вызвать это .. кстати, рефактор первого уровня вашего создания я бы сделал

public async Task<IActionResult> Create(int id, int type)
{
        InsuranceViewModel model;
        ViewBag.Type = type;

        var companies = await _context.InsuranceCompany
            .Where(e => e.IsActive)
            .ToListAsync();
        ViewData["CompanyList"] = new SelectList(companies, "Id", "CompanyName");

        switch ((InsuranceType)type)
        {
            case InsuranceType.Body:
                model = await insuranceTypeBodyCreate(id, type);
                break;
            case InsuranceType.ThirdPart:
                model = await insuranceTypeThirdPartCreate(id, type);
                break;
            default: 
		// Throw An Exception ?
                break;
        }

        return View(model);
}


Который нуждается в двух новых функциях insuranceTypeBodyCreate(id, type); & insuranceTypeThirdPartCreate(id, type); и я уверен, что логика в каждой из них для not null vs null может быть сделана "лучше"

Member 14615938

Я написал этот код, но проблема в том, что он сталкивается с этой ошибкой в разделе...
обратный вид(модель)
ошибка: использование неназначенной локальной переменной 'model'

Рейтинг:
0

Patrice T

Цитата:
не все пути кода возвращают значение.

Это означает, что некоторые части кода имеют возврат, а другие-нет.
В вашем случае a } отсутствует до возврата, и это делает его частью else.
    }

    return View(model);
} // this } is the end of the else