[英]How to pass List String to TempData Asp.Net
我有一个Tempada在msg错误中显示错误列表,我创建一个列表,并在我的foreach中,每个错误都找到它,我在列表中添加错误,然后在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>
}
但出现错误,请在此处输入图片描述
TempData["error-message"]
将字符串列表存储为Object
。 因此,您需要首先获取它,将其转换为字符串列表,遍历每个字符串并进行渲染。
Razor基本上在表达式(在您的情况下为object
)上调用ToString
,因此您将看到当前结果
这应该工作
@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
现在,在您的视图或布局中,您可以通过将div元素与messages
属性一起使用来调用此标签助手
<div messages></div>
随时更新标记帮助程序代码,以呈现所需的HTML标记消息。
对于Non-Asp.Net核心项目,您可以创建一个执行相同操作的html helper方法。
问题是您在视图中显示@TempData["error-message"]
,但是TempData
本质上是Dictionary<string, object>
,这意味着当您访问该键上的值时,该值是object 。
即使将其强制转换为实际值( 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>
...这取决于您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.