Интерпретация данных, полученных с помощью компонента View ASP Razor MVC - PullRequest
0 голосов
/ 30 января 2020

Я использую View View для создания части MVC Page. Компонент View попадает в базу данных и создает таблицу результатов, если запрос дает результаты. Запрос, выдающий результаты, означает, что есть проблема, поэтому я настроил компонент представления так, чтобы он отображался только при наличии результатов. Этот запрос также предназначен для повторного использования в разных частях сайта, поскольку его результаты могут влиять на несколько страниц.

Прекрасно работает для отображения ошибки только в случае ее возникновения!

Однако на главной странице есть обработчик формы для отправки сообщения электронной почты, и я хочу отключить эту возможность, когда данные недействительны. Я использую ViewData.ModelState.IsValid, чтобы проверить, является ли модель действительной или нет. Однако, поскольку мой Компонент указывает, являются ли данные действительными, я столкнулся с проблемой!

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

Мне не нужно проверять содержимое компонента перед тем, как сделать страницу недействительной, мне просто нужно знать, произвел ли компонент что-либо вообще.

Может кто-нибудь помочь мне сделать это ?

Вот код для компонента:

namespace Reports.Shared.Validation
{
    public class IdentifierValidationViewComponent : ViewComponent
    {
        private readonly IdentifierValidationDB _IdentifierValidationContext;

        public IdentifierValidationViewComponent(IdentifierValidationDB IdentifierValidationContext)
        {
            _IdentifierValidationContext = IdentifierValidationContext;
        }

        public List<IdentifierValidation> InvalidIdentifiers { get; set; }

        public async Task<IViewComponentResult> InvokeAsync(string date)
        {
            InvalidIdentifiers = await _IdentifierValidationContext.IdentifierValidations.FromSqlRaw("EXEC Reports.IdentifierValidation {0}", date).ToListAsync();

            return View(InvalidIdentifiers);
        }
    }
}

Вот частичное представление, которое визуализирует компонент:

@model List<Reports.Models.Shared.Validation.IdentifierValidation>


@if (Model.Count() > 0)
{
    <div id="InvalidIdentifiers" class="alert-danger">
        <h2>Values are missing Identifiers!</h2>
        <ul>
            @foreach (var invalid in Model)
            {
            <li>
                @invalid.SecName has no Identifier.
            </li>
            }
        </ul>
    </div>
}

Наконец, я вызываю компонент на главной странице с этой строкой

@await Component.InvokeAsync("IdentifierValidation", new { date = Model.Date }) 

Все, что я хочу сделать, - это проверить на главной странице, действительно ли компонент производит HTML или нет, а затем аннулировать ViewData.ModelState.IsValid, если это так.

1 Ответ

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

Я понял это!

В моем случае, потому что мне нужно только проверять во время начальной загрузки страницы, дает ли таблица результаты или нет, и статус не должен быть сохраненный между обновлениями, я могу использовать ViewContext.HttpContext.Items[] для хранения флага, указывающего, заполнена ли таблица. Мне нужно было внести изменения в Компонент и главную страницу, но со следующими изменениями, похоже, он работает!

Контроллер:

namespace Reports.Shared.Validation
{
    public class IdentifierValidationViewComponent : ViewComponent
    {
        private readonly IdentifierValidationDB _IdentifierValidationContext;

        public IdentifierValidationViewComponent(IdentifierValidationDB IdentifierValidationContext)
        {
            _IdentifierValidationContext = IdentifierValidationContext;
        }

        public List<IdentifierValidation> InvalidIdentifiers { get; set; }

        public async Task<IViewComponentResult> InvokeAsync(string date)
        {
            InvalidIdentifiers = await _IdentifierValidationContext.IdentifierValidations.FromSqlRaw("EXEC Reports.IdentifierValidation {0}", date).ToListAsync();

            if(InvalidIdentifiers.Count() > 0)
            {
                ViewContext.HttpContext.Items["InvalidIdentifier"] = "Detected";
            }

            return View(InvalidIdentifiers);
        }
    }
}

И теперь мы можем вызвать контроллер как например:

@await Component.InvokeAsync("IdentifierValidation", new { date = Model.Date })
@if (ViewContext.HttpContext.Items["InvalidIdentifier"] != null)
{
    ViewData.ModelState.AddModelError("InvalidIdentifier", "An Invalid Identifier has been Detected!");
}

Когда мы делаем это, мы аннулируем состояние модели только в том случае, если частичное получение результатов, когда оно было загружено на страницу refre sh!

Конечно, если вы Вы делаете что-то более изощренное, например, с помощью javascript / ajax для обновления sh содержимого партиала на стороне клиента, это не будет работать.

...