如何从C#方法中添加Razor标记?

9 浏览
0 Comments

如何从C#方法中添加Razor标记?

目标:\n我在页面上有一个表单,当用户点击发送表单的按钮时,将调用方法OnFinish。在这个方法中,我想向页面添加新的标记。(表单的代码与此无关,所以我不会在这里添加它)\n问题:\n似乎没有简单的方法(如果有的话)可以从C#代码中添加Razor标记。\n我尝试过的方法:\n我尝试的第一件事是在C#代码中直接写标记。代码如下所示:\nprivate void OnFinish(EditContext editContext)\n{\n 占位符\n}\n这当然不起作用,因为我是在一个.cs文件中编写它。\n在.razor文件中,我尝试了相同的方法:\n@code\n{\n private void OnFinish(EditContext editContext)\n {\n 占位符\n }\n}\n编译器也不喜欢这个方法,并引发了以下错误:\n当前上下文中不存在“__builder”名称。\n我从这个问题中很快了解到,标记不能在@code块中编写。\n根据官方ASP.NET博客文章,写在@functions块中的标记应该是有效的:\n@functions\n{\n private void OnFinish(EditContext editContext)\n {\n 占位符\n }\n}\n不幸的是,这与使用@code块的结果相同。\n编辑:在再次阅读博客文章后,我意识到该功能只适用于.cshtml文件。我测试了一下,确实在.cshtml文件中有效。但是这些文件不能用作组件,所以对我来说并不起作用。\n我尝试在方法中使用RenderTreeBuilder __builder作为参数,这是在这个答案中提到的建议。\n这种解决方案的问题是,__builder参数只能在标记代码内部使用,如下所示:\n@__builder\n而不能从C#代码中使用(这就是为什么使用该参数)。\n接下来我找到的是@helper块,在这个答案中提到了它。我将它应用到我的代码中,如下所示:\n@helper OnFinish(EditContext editContext) \n{\n 占位符\n}\n这也不起作用,因为编译器引发了以下两个错误:\n不支持helper指令。\n当前上下文中不存在“helper”名称。\n结论:\n现在,搜索到此为止。我花了很多时间研究这个问题,我想相信可能根本没有解决方案。我错过了什么?\n编辑:\n某些情况下了将标记放在if语句中的想法,当某个条件为真时,if语句会激活(例如,我有一个bool变量,我将其设置为true,或者我更改一个变量,if语句会识别到)。\n这个解决方案可以在这个问题的另一个问题或当前线程的这个答案中看到。\n该解决方案的代码如下:\nif (renderNewMarkup)\n{\n 占位符\n}\n@functions\n{\n private void OnFinish(EditContext editContext)\n {\n renderNewMarkup = true;\n }\n}\n这确实起作用,但在我看来非常不愉快。我对此的问题是使用变量。\n在我的程序中,我从UI中获取一些数据,并将其传递给随后创建的标记。我可以给你一个例子:\nprivate void OnFinish(EditContext editContext)\n{\n Dictionary dict = new()\n {\n [\"Key1\"] = boundVariable,\n [\"Key2\"] = otherBoundVariable,\n [\"Key3\"] = anotherBoundVariable\n }\n // 使用dict变量创建标记\n}\n我想要添加到HTML中的标记是一个具有Dictionary参数的自定义Razor组件。\n你可以看到,我现在不能简单地在那里创建标记。为了实现我想要的效果,代码将如下所示:\n@if (renderNewCustomComponent)\n{\n \n}\n@code\n{\n private Dictionary dict;\n private void OnFinish(EditContext editContext)\n {\n dict = new()\n {\n [\"Key1\"] = boundVariable,\n [\"Key2\"] = otherBoundVariable,\n [\"Key3\"] = anotherBoundVariable\n }\n renderNewCustomComponent = true;\n }\n}\n我希望你能理解我的意思。\n然后,这种解决方案还存在一个更大的问题。当我想调用一个方法,例如AddElementToHTML(),它将始终向HTML添加一些元素,这是不可能的。是的,通过一些复杂的方式,使用@foreach或其他方法,可能是可能的,但为什么语言一开始就不允许呢?

0
0 Comments

问题的原因:

在Blazor中,如果想在C#方法中添加Razor标记,就需要找到一种方法来将HTML字符串转换为Razor标记,以便能够在页面上显示。

解决方法:

为了在C#方法中添加Razor标记,可以按照以下步骤进行操作:

1. 首先,在所需的页面或组件的C#代码中定义一个字符串变量,用于存储HTML标记。例如,可以使用以下代码来定义一个名为CustomHtml的字符串变量:

string CustomHtml;

2. 接下来,在C#方法中,通过给CustomHtml变量赋值来设置要显示的HTML标记。例如,可以使用以下代码在OnFinish方法中设置CustomHtml变量的值:

private void OnFinish(EditContext editContext)
{
    CustomHtml = "You are now registered!";
}

3. 最后,在Razor页面或组件的HTML部分中,使用条件语句来判断CustomHtml变量是否有值,并将其作为Razor标记显示在页面上。例如,可以使用以下代码在

元素中显示CustomHtml变量的值:

@if (!string.IsNullOrEmpty(CustomHtml))
{
    
@((MarkupString)CustomHtml)
}

通过以上步骤,就可以在C#方法中添加Razor标记,并在页面上显示相应的HTML内容。

0
0 Comments

问题的出现原因:

用户想知道如何从C#方法中添加Razor标记。他遇到了一些困难,因为需要使用额外的{}来包裹标记,并且无法直接在C#代码中调用方法。

解决方法:

用户可以通过以下方式解决问题:

1. 在C#方法内部定义一个本地函数(F1),然后在Razor代码中调用该函数。

2. 或者从类中调用另一个方法(F2),并将RenderTreeBuilder作为参数传递给该方法。

3. 如果需要在OnFinish(editContext)方法中添加标记,仍然需要使用()来调用该方法。

4. 建议用户不要过于关注在方法中添加标记,而是根据逻辑条件创建组件,并根据需要显示这些组件。可以使用[Parameter]在组件之间传递数据。

注意:

OnFinish()方法可能是来自Telerik UI控件或其他自定义UI库的自定义事件。用户可以查看其他人如何使用该方法的示例来更好地理解它的用法。另外,建议用户使用组件来管理标记,而不是直接在方法中添加标记。

0
0 Comments

如何从C#方法中添加Razor标记?

这个问题的出现的原因是:

用户想要了解如何在C#方法中添加Razor标记,并将其呈现到页面上。

解决方法是:

1. 创建一个包含Razor标记的RenderFragment。

2. 在C#方法中使用builder.AddMarkupContent方法将标记添加到RenderFragment中。

3. 在需要呈现Razor标记的地方,使用RenderFragment进行渲染。

下面是一个示例代码,演示了如何在C#方法中添加Razor标记并进行呈现:

"/Test"

Test8

{ RenderFragment Placeholder { get; set; } string content = "
Hello
"; void RenderSomeContent() { Placeholder = (builder) => { builder.AddMarkupContent(0, content); }; } void ClearContent() { Placeholder = null; } }

以上代码演示了一个包含RenderFragment的组件,其中包含一个按钮,点击按钮将Razor标记添加到RenderFragment中,然后在页面上呈现。

希望以上内容对您有所帮助!

0