【问题标题】:Interpret Data produced by View Component ASP Razor MVC解释视图组件 ASP Razor MVC 生成的数据
【发布时间】:2020-01-30 22:47:34
【问题描述】:

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

非常适合仅在出现问题时才显示错误!

但是,主页有一个用于发送电子邮件的表单处理程序,我想在数据无效时禁用该功能。我使用ViewData.ModelState.IsValid 来检查模型是否有效。但是,由于我的 Component 指示数据是否有效,所以我遇到了问题!

我不知道如何检查组件是否已填充,而不是以某种方式将其硬编码回原始页面。我似乎无法将视图数据从 Component 传递到调用页面(尽管另一个方向效果很好),我什至无法将页面订阅到事件,因为我看不到将 Component 实例与页面关联的方法!

我不需要在使页面失效之前检查组件的内容,我只需要知道组件是否产生了任何东西。

谁能帮我做这个?

这是组件的代码:

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 无效。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core asp.net-core-3.0


    【解决方案1】:

    我想通了!

    在我的情况下,因为我只需要在页面的初始加载过程中检查表格是否产生了结果,并且由于刷新之间不需要保留状态,我可以使用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 在客户端刷新部分的内容,这是行不通的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多