Выберите 2 Asp. net MVC - выпадающий список не оценивается с исходными данными - PullRequest
0 голосов
/ 22 января 2020

Я использую select2, используя MVC 5 и C#.

У меня проблемы с загрузкой выпадающего списка (select2) с начальными данными модели.

элементы, переданные в соответствующем поле привязки, оценены правильно, но они не отображаются в select2!

Я имею в виду, несмотря на то, что список полей ViewModel, правильно оцененных контроллером, выпадающий список (select2) не оценивается правильно, как будто модель привязки не работает.

Само собой разумеется, я гуглю 1,5 дня.

К счастью (:)) У меня нет проблем при загрузке select2 со всеми элементами, выпадающий список работает корректно даже на пост, даже я могу взять выбранные элементы.

Большое спасибо все

Ps: теперь, когда я пишу, у меня есть сомнения; Может быть, select2 не работает со списком?

Просмотр

@section scripts{

     ...

    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
}

@Html.DropDownListFor(model => model.MezziStraSelect, Model.MezziStraOrdinari, new { style = "width: 100%", @class = "form-control" })

JS

$(document).ready(function () {

    //...

    $("#MezziStraSelect").select2({
        placeholder: "Select one or more items",
        multiple: true,
        allowClear: true
    });

    @if ( Model.MezziStraSelect == null)
    {
        <text>$("#MezziStraSelect").val(null).trigger("change");</text>
    }    
}

ViewModel

public Guid[] MezziStraSelect { get; set; }

public MultiSelectList MezziStraOrdinari { get; set; }

Контроллер

//Load List MezziStraOrdinari
var _stra = m.GetMezziStraordinari().Select(x => new
{
    id = x.VoceSpesaID,
    desc = x.VoceSpesa
}).ToList();

//view model set field
vm.MezziStraOrdinari = new MultiSelectList(_stra, "id", "desc");

//Load array Mezzi used from item selected


List<Guid> _mezziStraUsati = new List<Guid>();
var elems = dc.ItemSelected.FirstOrDefault(x => x.ItemID.ToString() == _guidSelected);
if (elems!=null)
{
    elems.VociSpese.ToList().ForEach(x =>
    {
        if (x.VociSpesa.Straordinario == true)
            _mezziStraUsati.Add(x.VoceSpesaViaggioID); //VoceSpesaViaggioID is GUID 
    });
    if (_mezziStraUsati.Count>0)
        vm.MezziStraSelect = _mezziStraUsati.ToArray(); //Guid[]
}

1 Ответ

0 голосов
/ 23 января 2020

Первоначальная загрузка Select2, к сожалению, привязка не может установить начальные значения!

Поэтому, читая документацию Select2 по этой ссылке , мне пришлось продолжить загрузку вручную через JS.

Практически, чтобы попытаться сделать что-то человеческое (я надеюсь, что это так), я создал метод Extension в бэкэнде поля Model

Метод расширения

public static string ToSelect2Array<T>(this T[] values)
{
    var resp = string.Empty;
    values.ToList().ForEach(x => resp += $"'{x.ToString()}',");
    if (resp.Length > 0)
        resp = resp.Substring(0, resp.Length - 1);

    return resp;
}

, а затем на JS клиентской стороне, я называю это так:

VIEW (скрипт JS)

        @if ( Model.MezziStraSelect != null)
        {
            <text>
            $("#MezziStraSelect").val([@Html.Raw(Model.MezziStraSelect.ToSelect2Array())]);
            $("#MezziStraSelect").trigger('change');
            </text>
        }
        else
        {
            <text>$("#MezziStraSelect").val(null).trigger("change");</text>
        }

Это работает довольно хорошо, но возможно ли, что нет способа заставить его автоматически связываться?

Мне было бы интересно узнать другие решения, более изящные, чем это, за которые я был бы благодарен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...