Member 14164795 Ответов: 2

Ясно, связанными свойствами, при проводке (страниц бритвы )


Как мне очистить привязку к этим свойствам, чтобы изменения, которые я пытаюсь внести в метод onpost, прошли?

У меня есть 6 связанных свойств в ShipmentModel:

[BindProperty(SupportsGet = true)] public ShipmentModel Shipment { get; set; }
public class ShipmentModel
{
    public string CurrentShipDt1 { get; set; }
    public int CurrentShipQty1 { get; set; }
    public string CurrentShipDt2 { get; set; }
    public int CurrentShipQty2 { get; set; }
    public string CurrentShipDt3 { get; set; }
    public int CurrentShipQty3 { get; set; }
}


В моем onget я запускаю несколько запросов linq, и он правильно публикует результаты в эти свойства:

public async Task<IActionResult> OnGetAsync(string partNo, string requestStatus, string supplier, string searchString)
{
    // Find the current shipment info for this part
    CmtPartShipSchedule = await _context.CmtPartShipSchedules
        .OrderByDescending(m => m.EnterDt)
        .FirstOrDefaultAsync(m => m.PartNo == partNo);

    if (CmtPartShipSchedule != null){
        var shipDtQuery = (from c in _context.CmtPartShipments
                           where CmtPartShipSchedule.Id == c.CmtPartShipScheduleId
                           orderby c.ShipDt descending
                           select c.ShipDt).ToList();
        List<DateTime> CmtPartShipDts = shipDtQuery;

        var shipQtyQuery = (from c in _context.CmtPartShipments
                            where CmtPartShipSchedule.Id == c.CmtPartShipScheduleId
                            orderby c.ShipDt descending
                            select c.ShipQty).ToList();
        List<int> CmtPartShipQtys = shipQtyQuery;

        CmtPartShipment = await _context.CmtPartShipments
            .FirstOrDefaultAsync(m => m.CmtPartShipScheduleId == CmtPartShipSchedule.Id);

        int shipCount = shipDtQuery.Count();

        if (shipCount > 0)
        {
            if (CmtPartShipDts[0] != null & CmtPartShipQtys[0] != 0)
            {
                string ShipDt1 = CmtPartShipDts[0].ToString("yyyy-MM-dd");
                Shipment.CurrentShipDt1 = ShipDt1;
                Shipment.CurrentShipQty1 = CmtPartShipQtys[0];
            }
        }
        if (shipCount > 1)
        {
            if (CmtPartShipDts[1] != null & CmtPartShipQtys[1] != 0)
            {
                string ShipDt2 = CmtPartShipDts[1].ToString("yyyy-MM-dd");
                Shipment.CurrentShipDt2 = ShipDt2;
                Shipment.CurrentShipQty2 = CmtPartShipQtys[1];
            }
        }
        if (shipCount > 2)
        {
            if (CmtPartShipDts[2] != null & CmtPartShipQtys[2] != 0)
            {
                string ShipDt3 = CmtPartShipDts[2].ToString("yyyy-MM-dd");
                Shipment.CurrentShipDt3 = ShipDt3;
                Shipment.CurrentShipQty3 = CmtPartShipQtys[2];
            }
        }
    }
    return Page();
}


Проблема заключается в методе onpost, который я создал - он должен очистить все свойства, имеющие значения в них, которые были установлены в моем onget одним нажатием кнопки. Однако я не могу заставить его сделать именно это. На данный момент он правильно проходит через мой метод, но не публикует результаты (из-за привязки модели, которая перезаписывает эти изменения, которые я пытаюсь сделать, я предполагаю). Вот что у меня есть:

public async Task<IActionResult> OnPostCurrentPOsAsync(string partNo, string requestStatus, string supplier, string searchString)
{
    if (!ModelState.IsValid) { return Page(); }

    // Tried to clear the bind so that I can overwrite.. Doesn't change anything
    // https://weblog.west-wind.com/posts/2012/apr/20/aspnet-mvc-postbacks-and-htmlhelper-controls-ignoring-model-changes
    //ModelState.Remove(Shipment.CurrentShipDt1);
    //ModelState.Remove(Shipment.CurrentShipDt2);
    //ModelState.Remove(Shipment.CurrentShipDt3);
    //ModelState.Remove(Shipment.CurrentShipQty1.ToString());
    //ModelState.Remove(Shipment.CurrentShipQty2.ToString());
    //ModelState.Remove(Shipment.CurrentShipQty3.ToString());

    Shipment.CurrentShipDt1 = null; Shipment.CurrentShipQty1 = 0;
    Shipment.CurrentShipDt2 = null; Shipment.CurrentShipQty2 = 0;
    Shipment.CurrentShipDt3 = null; Shipment.CurrentShipQty3 = 0;

    int shipCount = POETAs.Count();

    if (shipCount > 0)
    {
        if (POETAs[0] != null & POQtys[0] != 0)
        {
            string ShipDt1 = POETAs[0].ToString("yyyy-MM-dd");
            Shipment.CurrentShipDt1 = ShipDt1;
            Shipment.CurrentShipQty1 = POQtys[0];
        }
    }
    if (shipCount > 1)
    {
        if (POETAs[1] != null & POQtys[1] != 0)
        {
            string ShipDt2 = POETAs[1].ToString("yyyy-MM-dd");
            Shipment.CurrentShipDt2 = ShipDt2;
            Shipment.CurrentShipQty2 = POQtys[1];
        }
    }
    if (shipCount > 2)
    {
        if (POETAs[2] != null & POQtys[2] != 0)
        {
            string ShipDt3 = POETAs[2].ToString("yyyy-MM-dd");
            Shipment.CurrentShipDt3 = ShipDt3;
            Shipment.CurrentShipQty3 = POQtys[2];
        }
    }

    CurrentSupplier = supplier;

    return RedirectToPage("", new { partNo = CurrentPart, requestStatus = RequestStatus, supplier = CurrentSupplier, searchString = SearchString });
}


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

Первоначально я использовал return Page(); и a похожий пост здесь сказал мне изменить это, чтобы вернуть RedirectToPage (), но все равно никаких изменений. Кроме того, ссылки эта статья, Я попробовал использовать ModelState.Удалите, чтобы "очистить привязку", по-прежнему никаких изменений.

2 Ответов

Рейтинг:
2

Member 14164795

Это сработало для меня:

Shipment.CurrentShipDt1 = null; Shipment.CurrentShipQty1 = 0;
Shipment.CurrentShipDt2 = null; Shipment.CurrentShipQty2 = 0;
Shipment.CurrentShipDt3 = null; Shipment.CurrentShipQty3 = 0;
Shipment.CurrentShipDt4 = null; Shipment.CurrentShipQty4 = 0;
Shipment.CurrentShipDt5 = null; Shipment.CurrentShipQty5 = 0;

ModelState.Clear();

return Page();


Рейтинг:
0

jimmson

Вам нужно передать имя свойства в ModelState.Remove метод, а не ценность.
Либо передайте имя свойства в строке, например. ModelState.Remove("CurrentShipDt1"); или в более новой платформе .NET framework вы можете использовать nameof() ключевое слово, например. ModelState.Remove(nameof(Shipment.CurrentShipDt1));


Member 14164795

Это не сработало для меня, однако я нашел свою проблему :) Я пытался удалить состояние модели до установки моих значений на то, что я хотел, а не после!