Nano Hash - криптовалюты, майнинг, программирование

asp.net mvc multiselect запомнить состояние после обратной передачи

Я использую DataAnnotations для проверки ошибок в моем приложении asp.net mvc, я также использую строго типизированные ViewModels.

Моя проверка ошибок работает нормально и отправляет обратно в мое представление с сообщениями об ошибках, если поле пусто. Однако у меня есть MultiSelect/Listbox в моей форме, и мне нужно запомнить его состояние после ошибки.

На данный момент моя ViewModel выглядит так (я включил только соответствующие свойства):

public class ProfilePageViewModel : PageViewModel
{
    public IList<FavouriteGenreViewModel> FavGenres { get; set; }

    [Required(ErrorMessage = "*")]
    public string SelectedGenres { get; set; }


    public IDictionary<int, string> GenresList { get; set; }
}

Это мое действие в моем контроллере:

public ActionResult Profile(ProfilePageViewModel viewModel)
    {
        if(!ModelState.IsValid)
        {
            viewModel.CountriesList = dropDownTasks.GetCountries();
            viewModel.GendersList = dropDownTasks.GetGenders();
            viewModel.GenresList = dropDownTasks.GetGenres();
            viewModel.TimezonesList = dropDownTasks.GetTimezones();
            viewModel.FavGenres = 
            return View(viewModel); 
        }

        . . .

Мой MultiSelect берет список моделей FavouriteGenreViewModel для выбора опций в GenresList, он делает это с помощью AutoMapper в действии GET, но, очевидно, я не могу использовать AutoMapper в сообщении, потому что он забудет мои опубликованные значения.

Я думал об использовании строки идентификаторов с разделителями-запятыми вместо списка FavouriteGenreViewModel, таким образом, я могу повторно использовать значение, отправленное обратно... однако я надеюсь, что у кого-то есть более элегантный способ справиться с этой проблемой.

Спасибо!

Павел


Ответы:


1

Я думаю, что смогу ответить на свой вопрос после некоторого возни.

В моей ViewModel я использую массив строк в качестве типа данных, например:

public class ProfilePageViewModel : PageViewModel 
{ 
[Required(ErrorMessage = "*")] 
public string[] FavGenres { get; set; } 

public IDictionary<int, string> GenresList { get; set; } 
} 

На мой взгляд, я могу установить выбранные значения в FavGenres, тогда у меня есть настраиваемый модуль связывания модели, чтобы снова преобразовать строку, разделенную запятыми, в действительные объекты... если вам интересно, вот мой пользовательский модуль связывания модели в полном объеме...

public class AccountCustomModelBinder : DefaultModelBinder
{
    private readonly IGenreRepository genreRepository;
    private readonly ITimezoneRepository timeZoneRepository;
    private readonly ICountryRepository countryRepository;

    public AccountCustomModelBinder() : this(
        ServiceLocator.Current.GetInstance<IGenreRepository>(),
        ServiceLocator.Current.GetInstance<ITimezoneRepository>(),
        ServiceLocator.Current.GetInstance<ICountryRepository>())
    {
    }

    public AccountCustomModelBinder(IGenreRepository genreRepository, ITimezoneRepository timeZoneRepository,
        ICountryRepository countryRepository)
    {
        Check.Require(genreRepository != null, "genreRepository is null");
        Check.Require(timeZoneRepository != null, "timeZoneRepository is null");
        Check.Require(countryRepository != null, "countryRepository is null");

        this.genreRepository = genreRepository;
        this.timeZoneRepository = timeZoneRepository;
        this.countryRepository = countryRepository;
    }

    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
    {
        Account account = bindingContext.Model as Account;

        if (account != null)
        {

            // gender
            if (propertyDescriptor.Name == "Gender")
            {
                if (bindingContext.ValueProvider.ContainsKey("Gender"))
                {
                    account.Gender = bindingContext.ValueProvider["Gender"].AttemptedValue.ToString();
                    return;
                }
            }

            // TimezoneId
            if (propertyDescriptor.Name == "TimezoneId")
            {
                if (bindingContext.ValueProvider.ContainsKey("TimezoneId")) {
                    account.Timezone = timeZoneRepository.FindOne(Convert.ToInt32(bindingContext.ValueProvider["TimezoneId"].AttemptedValue));
                    return;
                }
            }

            // CountryId
            if (propertyDescriptor.Name == "CountryId")
            {
                if (bindingContext.ValueProvider.ContainsKey("CountryId")) {
                    account.Country = countryRepository.FindOne(Convert.ToInt32(bindingContext.ValueProvider["CountryId"].AttemptedValue));
                    return;
                }
            }

            // FavGenres
            if (propertyDescriptor.Name == "FavGenres")
            {
                if (bindingContext.ValueProvider.ContainsKey("FavGenres")) {
                    // remove all existing entries so we can add our newly selected ones
                    account.ClearFavGenres();
                    string favIds = bindingContext.ValueProvider["FavGenres"].AttemptedValue;
                    foreach (string gId in favIds.Split(',')) {
                        account.AddFavGenre(genreRepository.Get(Convert.ToInt32(gId)));
                    }
                    return;
                }
            }
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }

}
17.01.2010
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..