Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解释视图组件ASP.MVC生成的数据_C#_Asp.net Mvc_Asp.net Core_Asp.net Core 3.0 - Fatal编程技术网

C# 解释视图组件ASP.MVC生成的数据

C# 解释视图组件ASP.MVC生成的数据,c#,asp.net-mvc,asp.net-core,asp.net-core-3.0,C#,Asp.net Mvc,Asp.net Core,Asp.net Core 3.0,我正在使用视图组件创建MVC页面的一部分。如果查询生成结果,视图组件将转到数据库,并生成结果表。产生结果的查询意味着存在问题,因此我将视图组件设置为仅在有结果时显示。此查询也可以在站点的不同部分重复使用,因为其结果可能会影响多个页面 只在出现问题时才显示错误非常有用 但是,主页有一个用于发送电子邮件的表单处理程序,我想在数据无效时禁用该功能。我使用ViewData.ModelState.IsValid检查模型是否有效。但是,因为我的组件指示数据是否有效,所以我遇到了一个问题 我不知道如何检查组件

我正在使用视图组件创建MVC页面的一部分。如果查询生成结果,视图组件将转到数据库,并生成结果表。产生结果的查询意味着存在问题,因此我将视图组件设置为仅在有结果时显示。此查询也可以在站点的不同部分重复使用,因为其结果可能会影响多个页面

只在出现问题时才显示错误非常有用

但是,主页有一个用于发送电子邮件的表单处理程序,我想在数据无效时禁用该功能。我使用
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);
        }
    }
}
我所要做的就是让主页检查组件是否实际生成HTML,然后使
ViewData.ModelState.IsValid无效,如果是这样。

我找到了答案

在我的情况下,因为我只需要在页面的初始加载期间检查表是否已生成结果,并且因为在刷新之间不需要保留状态,所以我可以使用
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);
        }
    }
}
当我们这样做的时候,只有当加载到页面刷新时部分生成结果时,我们才使模型状态无效

当然,如果您正在用它做一些更有趣的事情,比如在客户端使用javascript/ajax刷新部分的内容,这将不起作用

@await Component.InvokeAsync("IdentifierValidation", new { date = Model.Date }) 
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!");
}