我有一个Tempada在msg错误中显示错误列表,我创建一个List并在我的foreach中,每个错误找到它,我在我的List中添加一个错误,然后我在TempData中显示这个列表
public IActionResult Demo()
{
List<string> LogErros = new List<string>();
try
{
foreach (var item in somethings)
{
// if have some error add to list
LogErros.add();
}
if (LogErros.Count > 0)
{
TempData["error-message"] = LogErros;
}
}
return View();
}
我试试这个:
@if (TempData["error-message"] != null)
{
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">x</button>
@TempData["error-message"]
</div>
}
答案 0 :(得分:1)
TempData["error-message"]
将字符串列表存储为Object
。因此,您需要首先将其转换为字符串列表,然后遍历每个字符串并进行渲染。
Razor基本上会调用表达式上的ToString
(在您的情况下为object
),因此您会看到当前结果
这应该有效
@if (TempData["error-message"] != null)
{
var errors = TempData["error-message"] as List<string>;
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" >x</button>
@foreach(var errorMessage in errors)
{
<p>@errorMessage</p>
}
</div>
}
虽然这有效,但我建议不要在视图中放入大量的C#代码。如果它是一个asp.net核心项目,我建议为此创建一个标记帮助器。这是一个非常简单的问题。
[HtmlTargetElement("div", Attributes = "messages")]
public class AlertMessagesTagHelper : TagHelper
{
[ViewContext]
public ViewContext ViewContext { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
StringBuilder str = new StringBuilder();
var messages = ViewContext.TempData["error-message"] as List<string>;
if (messages != null && messages.Any())
{
str.Append("<div class='alert alert-danger alert-dismissable'>");
foreach (var message in messages)
{
str.AppendFormat("<div>{0}</div>", message);
}
str.Append("</div>");
}
output.Content.AppendHtml(str.ToString());
}
}
现在在_ViewImports.cshtml
文件中,使用addTagHelper
方法包含项目中的所有代码帮助程序
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, YourAssemblyName
现在在您的视图或布局中,您可以使用带有messages
属性的div元素
<div messages></div>
随意更新标记帮助程序代码,以呈现消息所需的HTML标记。
对于Non-Asp.Net核心项目,您可以创建一个html帮助器方法,它可以执行相同的操作。
答案 1 :(得分:0)
问题是您在视图中显示@TempData["error-message"]
,但TempData
为essentially a Dictionary<string, object>
,这意味着当您访问该键的值时,该值为对象< / em>的。
即使你转换为它的实际值(List<string>
),它也会隐式调用.ToString()
,如果你只是使用@
符号来渲染,它将不会自动显示列表的内容在页面上。
您需要做的第一件事就是将对象投射到List<string>
:
var errorMessageList = TempData["error-message"] as List<string>;
然后你可以迭代列表中的值:
var errorMessageList = TempData["error-message"] as List<string>;
@if (errorMessageList != null)
{
<div class="alert alert-danger alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">x</button>
@foreach(var message in errorMessageList)
{
@message
}
</div>
}
当然你必须格式化你想要的方式,也许它应该以逗号分隔?也许它应该在他们自己的<span>
......这取决于你。