Blazor несколько привязок NumericUpDownField с помощью MatBlazor

Я новичок в Blazor и вообще новичок в фронтенд-разработке.

Я пытаюсь реализовать заказ карточек в интернет-магазине, который представляет отдельный продукт. Более того, я хочу иметь MatNumericUpDownField на каждой карточке, но я не хочу создавать сотни полей, которые будут привязаны к сотням полей NumericUpDown. Мне нужно какое-то динамическое решение.

Это мой код:

ProductCard

@page "/productcard"
@inherits ProductCardBase

@if (productsList == null)
{
    <div class="spinner"></div>
}
else
{
    <div class="card-deck">
        @foreach (var p in productsList)
        {
        <div class="card m-3" style="min-width: 18rem; max-width:30.5%;">
            <div class="card-header">
                <h3>@p.Caption</h3>
            </div>
            <div class="card-body text-center">
                <h4>Product ID : @p.ProductID</h4>
            </div>

            <img class="" src="@p.Pictures.FirstOrDefault()" />


            @if (p.Pictures.Count > 0)
            {
                <img class="card-img-top" src="@convertImageToDisplay(p.Pictures.FirstOrDefault().PictureDisplay.ToString())" />
            }


            <p>
                <MatNumericUpDownField Label="Quantity"
                                       @bind-Value=@testingNullableDecimal2
                                       DecimalPlaces=0
                                       Minimum=0 Maximum=null>
                </MatNumericUpDownField>
            </p>


            <div class="card-footer text-center">
                <a href=""
                   class="btn btn-primary m-1">View</a>

                <a href="#" class="btn btn-primary m-1">Edit</a>

                <a href="#" class="btn btn-danger m-1">Delete</a>
            </div>

        </div>

        }
    </div>

ProductCardBase

public class ProductCardBase : ComponentBase
{
    [Inject]
    IApiCallService<Product> apiCallService { get; set; }


    Product product { get; set; }
    public bool Result { get; set; }
    public string RecordName { get; set; }
    //public string[] Products { get; set; }
    public bool IsGridViewFiltered { get; set; }
    bool isLoading = true;
    public string SelectedBrand { get; set; }

    protected decimal? testingNullableDecimal2 = null;


    public bool IsVisible { get; set; }

    protected List<Product> productsList { get; set; }


    protected override async Task OnInitializedAsync()
    {
        product = new Product();

        await LoadProducts();
    }


   protected void Click(MouseEventArgs e)
    {
       
        testingNullableDecimal2 += 100;
    }

    private async Task LoadProducts()
    {
        await Task.Delay(500);

        productsList = await apiCallService.GetAllAsList("products");

    }

    protected string convertImageToDisplay(string image)
    {

        if (image != null)
        {
            var fs = string.Format("data:image/jpg;base64,{0}", image);
            return fs;
        }
        return "";
    }
}

В этом примере testingNullableDecimal2 привязан к каждой карте, но мне нужно разделить его для каждой отдельной карты.


person projo9494    schedule 15.03.2021    source источник


Ответы (2)


Одно из решений - поместить переменную привязки (testingNullableDecimal) в модель вашего продукта.

Затем вы меняете код следующим образом:

<MatNumericUpDownField Label="Quantity"
                       @[email protected]
                       DecimalPlaces=0
                       Minimum=0 Maximum=null>
</MatNumericUpDownField>

Кстати, я не знаком с инструментами MatBlazor, но установка максимального значения = null выглядит подозрительно. Это правильный синтаксис?

person Jason D    schedule 15.03.2021

Вариант Джейсона Д. хорош. Я часто использую методику передачи списков интерфейсов, а не реализаций. Затем у вас может быть расширение, которое предоставляет отображаемый материал: счетчики, логические значения, указывающие, выбран ли материал, и так далее.

person Bennyboy1973    schedule 16.03.2021