addModelError之后返回视图

时间:2019-03-14 05:22:54

标签: c# asp.net-mvc api

在此项目中,我创建了cardGroup。在httpGet方法中,我们获取了一些必要的信息,并传递给视图以填充下拉列表。当httpPost触发某些字段Date有问题时,我们必须使用addModelError返回错误,但是在返回View之后,所有ViewData都将清除并返回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 :(得分:0)

摘自this文章:

  

ViewData

{'file1': '/../../abc_file1.txt', 'extrafile1': '/../../abc_extrafile1.txt', 'file2': '/../../abc_file2.txt', 'file3': '/../../abc_file3.txt', 'extrafile3': '/../../abc_extrafile3.txt'}

所以发生的事情是,一旦您完成将其发回服务器的操作,您现在就收到了另一个请求,这意味着您需要重新填充ViewData项,以便再次填充其值,否则ll为空。

因此,我建议将Dropdown填充方法重构为控制器上的私有方法,然后在发现验证错误或仅通过调用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. 返回时在您的帖子中调用该方法。

如果将它们用于其他控制器,则可以将它们添加到return View(dto)LookupService或什至包含您的查找逻辑的常规帮助器类中(无论哪种适合您的UnitofWork模式,您),以使其对其他控制器可用,而不是像我的示例那样将其作为私有方法。

例如:

LookupRepository