вернуться к просмотру после addModelError - PullRequest
0 голосов
/ 14 марта 2019

В этом проекте я создаю cardGroup. в httpGet Method мы получаем некоторую необходимую информацию и переходим к просмотру, чтобы заполнить выпадающий список. когда httpPost сработает, если у какого-либо поля Date возникнет проблема, мы должны вернуть ошибку с addModelError, но после возврата View, все ViewData Clear и Return Exception. как справиться с этим. просто показать ошибку в поле зрения.

    [HttpGet]
    [Route("CreateCardGroup")]
    public ActionResult CreateCardGroup()
    {
        var discounts = 
         UnitOfWork.DiscountPatternRepository.GetNotExpireDiscountPattern();
        var discountDtos = discounts?.Select(c => new SelectListItem
        {
            Text = c.PatternTitle,
            Value = c.Id.ToString()
        }).ToList();
        ViewData["DiscountPatterns"] = discountDtos;

        var serials = 
        UnitOfWork.ChargeCardSerialRepository.GetNotAssignedSerials();
        var serialDtos = serials?.Select(c => new SelectListItem
        {
            Text = c.SerialNumber.ToString(),
            Value = c.Id.ToString()
        }).ToList();
        ViewData["ChargeSerials"] = serialDtos;

        ViewData["CardSerialCount"] = 
        UnitOfWork.GiftCardSerialRepository.GetNotUsedGiftSerials();

        return View();
    }



    [HttpPost]
    [Route("CreateCardGroup")]
    public ActionResult CreateCardGroup(CardGroupCreateDto dto)
    {
        if (!ModelState.IsValid)
            return View(dto);



        if(!UnitOfWork.DiscountPatternRepository
            .IsCardGroupDateInRange(dto.DiscountPatternId, 
             dto.ActiveFromDate, dto.ActiveToDate))
        {
            ModelState.AddModelError("ActiveFromDate", @"Error In Date.");
            return View(dto); <---Problem Here
        }

        var group = dto.LoadFrom();
        var insertedId = UnitOfWork.CardGroupRepository.Add(group);

        foreach (var rangeDto in group.CardGroupGiftSerialRanges)
        {
            for (var i = rangeDto.GiftCardSerialBegin; i <= 
                         rangeDto.GiftCardSerialEnd; i++)
            {
                var serial = 
                UnitOfWork.GiftCardSerialRepository.GetBySerial(i);
                if (serial != null)
                {
                    serial.CardGroupGiftSerialRangeId = rangeDto.Id;
                    serial.DiscountPatternId = group.DiscountPatternId;
                    UnitOfWork.Complete();
                }

            }
        }

        return Redirect("/CardGroup");
    }

1 Ответ

0 голосов
/ 14 марта 2019

С этой статьи:

ViewData

ViewData is a property of ControllerBase class.
ViewData is used to pass data from controller to corresponding view
Its life lies only during the current request. If redirection occurs, then its value becomes null. It’s required typecasting for getting data and check for null values to avoid error.

Итак, что происходит, когда вы отправили свое сообщение обратно на сервер, теперь вы находитесь в другом запросе, это означает, что вам необходимо заново заполнить элементы ViewData, чтобы их значения снова заполнялись, иначе они будут нулевыми.

Поэтому я бы рекомендовал рефакторинг вашего Dropdown.заполнение метода в приватный метод на вашем контроллере, а затем вызовите этот метод в своем сообщении, когда вы обнаружите ошибку проверки или просто возвращаетесь, вызвав return View(dto).

Если они используются в других контроллерах, вы можете добавить их в LookupService или LookupRepository или даже в общий вспомогательный класс, который содержит вашу логику поиска (все, что вписывается в ваш шаблон UnitofWork, лучше всего подходит вам), чтобы сделать их доступными для других контроллеров, вместо использования в качестве частного метода, как в моем примере.

Например, что-то вроде этого:

[HttpGet]
[Route("CreateCardGroup")]
public ActionResult CreateCardGroup()
{
    PopulateCreateCardGroupLookups();

    return View();
}



[HttpPost]
[Route("CreateCardGroup")]
public ActionResult CreateCardGroup(CardGroupCreateDto dto)
{
    if (!ModelState.IsValid)
    {
        PopulateCreateCardGroupLookups();
        return View(dto);
    }


    if(!UnitOfWork.DiscountPatternRepository
        .IsCardGroupDateInRange(dto.DiscountPatternId, 
         dto.ActiveFromDate, dto.ActiveToDate))
    {
        ModelState.AddModelError("ActiveFromDate", @"Error In Date.");
        PopulateCreateCardGroupLookups();
        return View(dto); <---Problem Here
    }

    var group = dto.LoadFrom();
    var insertedId = UnitOfWork.CardGroupRepository.Add(group);

    foreach (var rangeDto in group.CardGroupGiftSerialRanges)
    {
        for (var i = rangeDto.GiftCardSerialBegin; i <= 
                     rangeDto.GiftCardSerialEnd; i++)
        {
            var serial = 
            UnitOfWork.GiftCardSerialRepository.GetBySerial(i);
            if (serial != null)
            {
                serial.CardGroupGiftSerialRangeId = rangeDto.Id;
                serial.DiscountPatternId = group.DiscountPatternId;
                UnitOfWork.Complete();
            }

        }
    }

    return Redirect("/CardGroup");
}

private void PopulateCreateCardGroupLookups()
{
    var discounts = 
     UnitOfWork.DiscountPatternRepository.GetNotExpireDiscountPattern();
    var discountDtos = discounts?.Select(c => new SelectListItem
    {
        Text = c.PatternTitle,
        Value = c.Id.ToString()
    }).ToList();
    ViewData["DiscountPatterns"] = discountDtos;

    var serials = 
    UnitOfWork.ChargeCardSerialRepository.GetNotAssignedSerials();
    var serialDtos = serials?.Select(c => new SelectListItem
    {
        Text = c.SerialNumber.ToString(),
        Value = c.Id.ToString()
    }).ToList();
    ViewData["ChargeSerials"] = serialDtos;

    ViewData["CardSerialCount"] = 
    UnitOfWork.GiftCardSerialRepository.GetNotUsedGiftSerials();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...