解释由视图组件 ASP Razor MVC 生成的数据



我正在使用视图组件来创建MVC页面的一部分。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无效。

我想通了!

就我而言,因为我只需要在页面的初始加载期间检查表是否已生成结果,并且由于在刷新之间不需要保留状态,所以我可以使用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!");
}

当我们这样做时,只有当部分生成的结果在页面刷新时加载时,我们才会使模型状态无效!

当然,如果你正在用它做一些更花哨的事情,比如使用 javascript/ajax 在客户端刷新部分的内容,这是行不通的。

最新更新