繁体   English   中英

如何将列表字符串传递给TempData Asp.Net

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM