在addModelError之后返回视图

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

在这个项目中我创建了cardGroup。在httpGet方法中,我们获得了一些所需的信息并传递给视图来填充下拉列表。当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");
    }
c# asp.net-mvc api
1个回答
0
投票

来自this的文章:

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项目,以便再次填充它们的值,否则它们将为null 。

因此,我建议您将Dropdown填充方法重构为控制器上的私有方法,然后在发现验证错误时调用该方法,或者只是通过调用return View(dto)返回。

如果它们在其他控制器中使用,您可以将它们添加到LookupServiceLookupRepository,甚至是包含查找逻辑的通用助手类(无论哪种适合您的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();
}
© www.soinside.com 2019 - 2024. All rights reserved.