调用时禁用视图组件中的所有内容

Posted

技术标签:

【中文标题】调用时禁用视图组件中的所有内容【英文标题】:Disable everything in view components while invoking 【发布时间】:2018-12-17 04:10:09 【问题描述】:

下面是我在其中一个视图页面中的代码(Details.Cshtml

<div id="QAcomp" >
            @await Component.InvokeAsync("QuestionAnswers", new  activityQuestionAnswersList = Model.ActivityQuestionAnswers?.ToList() )
</div>

以上代码根据 UI 值调用组件问题和答案。 我现在的问题是如何查看 Details.cshtml 页面中只有只读或禁用的组件。我的意思是无论内容是什么,它都应该被禁用。并且用户应该无法更改它。

谁能帮我解决这个问题?

 public async Task<IViewComponentResult> InvokeAsync(IList<ActivityQuestionAnswersModel> activityQuestionAnswersList = null, bool readsonly = false)
    
        var questions = await _context.FQuestions.AsNoTracking().OrderBy(s=>s.DisplayOrder)

            .ProjectTo<QuestionsViewModel>().ToListAsync();
        ViewData["readonly"] = readsonly;


        return activityQuestionAnswersList == null
            ? View(questions)
            : View("ActivityQuestionAnswers",GetActivityQuesetions(questions, activityQuestionAnswersList));
    

【问题讨论】:

【参考方案1】:

您已经在使用的InvokeAsync 的第二个参数是传递给视图组件上的InvokeAsync 方法的参数。就像您已经在 QA 列表中传递一样,继续传递 bool,表明它是否是只读的。

public async Task<IViewComponentResult> InvokeAsync(
    List<ActivityQuestionAnswers> activityQuestionAnswersList, bool readonly = false)

    ViewData["readonly"] = readonly;
    ...

然后:

@await Component.InvokeAsync("QuestionAnswers", new  activityQuestionAnswersList = Model.ActivityQuestionAnswers?.ToList(), readonly = true )

然后,您可以在视图中利用此布尔值将 readonly 属性添加到您的输入中:

@
    var readonly = ViewData["readonly"] as bool? ?? false;


...

<input asp-for="Foo" readonly="@readonly">

如果@readonlyfalsenull,Razor 将省略该属性。

【讨论】:

我将以下方法更改为以下方法。但没有像你所说的那样工作。我仍然看到组件中的下拉菜单可以编辑,我希望它们变灰或禁用 您可能想要设置disabled 属性。它的工作原理相同。【参考方案2】:

对于 ViewComponent,它将在 Web 浏览器中呈现为 Html。因此,如果要禁用 ViewComponent 中的所有内容,则需要控制 ViewComponent 中的 Contoller 样式。

不要在每个标签上添加disabled,我建议您尝试css 来格式化您的视图。

您可以尝试将以下内容添加到wwwroot/css/site.css

#QAcomp 
text-decoration: none;
pointer-events: none;


#QAcomp input 
    display: block;

如果有一些控件没有被禁用,你可以添加额外的样式来禁用它们。

更新

变灰

#QAcomp 
text-decoration: none;
pointer-events: none;

#QAcomp input 
    display: block;
    background-color: #eee;

#QAcomp select 
    display: block;
    background-color: #eee;

【讨论】:

在 CSS 中是否有一个特殊的属性可以只显示 div QAcomp 中的文本框、下拉菜单?

以上是关于调用时禁用视图组件中的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

启用和禁用一个组件/HTML 中的所有元素

SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用Ribbon 负载均衡自定义 Ribbon 配置禁用 Eureka 实现 Ribbon 调用)

SpringCloud系列五:Ribbon 负载均衡(Ribbon 基本使用Ribbon 负载均衡自定义 Ribbon 配置禁用 Eureka 实现 Ribbon 调用)

可以在角度调用父组件功能时单击子组件上的任何按钮? [关闭]

Flutter组件(Widget)的局部刷新方式

ASP.NET Core 依赖注入错误:尝试激活时无法解析服务类型 - 调用视图组件时出现错误 [重复]