C# 解释视图组件ASP.MVC生成的数据
我正在使用视图组件创建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检查模型是否有效。但是,因为我的组件指示数据是否有效,所以我遇到了一个问题 我不知道如何检查组件
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!");
}