【问题标题】:asp.net MVC6 Implementing a tagbuilder class and get error on ".ToString"asp.net MVC6 实现标签生成器类并在“.ToString”上出错
【发布时间】:2016-05-04 04:41:14
【问题描述】:

我在尝试实现来自Levelnis 的博客的消息类时遇到编译错误。

有问题的班级是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc.Rendering;

namespace Notifier.Helpers.MessageNotifier
{
    public class Message
    {
        public MessageSeverity Severity { get; set; }

        public string Text { get; set; }

        public string Generate()
        {
            var isDismissable = Severity != MessageSeverity.Danger;
            if (Severity == MessageSeverity.None) Severity = MessageSeverity.Info;
            var sb = new StringBuilder();
            var divTag = new TagBuilder("div");
            divTag.AddCssClass("alert fade in");
            divTag.AddCssClass("alert-" + Severity.ToString().ToLower());


            var spanTag = new TagBuilder("span");
            spanTag.MergeAttribute("id", "MessageContent");

            if (isDismissable)
            {
                divTag.AddCssClass("alert-dismissable");
            }

            sb.Append(divTag.ToString(TagRenderMode.StartTag));

            if (isDismissable)
            {
                var buttonTag = new TagBuilder("button");
                buttonTag.MergeAttribute("class", "close");
                buttonTag.MergeAttribute("data-dismiss", "alert");
                buttonTag.MergeAttribute("aria-hidden", "true");
                buttonTag.InnerHtml = "×";
                sb.Append(buttonTag.ToString(TagRenderMode.Normal));
            }

            sb.Append(spanTag.ToString(TagRenderMode.StartTag));
            sb.Append(Text);
            sb.Append(spanTag.ToString(TagRenderMode.EndTag));
            sb.Append(divTag.ToString(TagRenderMode.EndTag));

            return sb.ToString();
        }
    }
}

我收到两个错误 - 第一个与“.ToString”有关:

sb.Append(divTag.ToString(TagRenderMode.StartTag));

它说:

No overload for method 'ToString' takes 1 arguments

第二个错误与该行有关:

buttonTag.InnerHtml = "×";

它说:

Property or indexer 'TagBuilder.InnerHtml' cannot be assigned to -- it is read only

我查看了文档和其他帖子,但到目前为止我还没有找到任何可以帮助我修改它以正确编译的东西......

这些方法在 Asp.net-core 中的实现方式是否不同,如果不是,有人可以建议另一种方法来执行这些操作吗?

【问题讨论】:

  • 我建议查看this 教程。您将使用 taghelper,而不是 tagbuilder。我认为它将以更清晰、更易于理解的代码和 html 解决
  • 谢谢汤姆。我决定退后一步,改变我创建 Tempdata 消息的方法 - 请参阅我的答案..

标签: asp.net asp.net-core asp.net-core-mvc tagbuilder


【解决方案1】:

似乎 TagBuilder 在 MVC6 中的工作方式与在 MVC5 中的工作方式不同。

使用StringWriterWriteTo() 方法代替ToString() 方法,如下所示:

StringBuilder result = new StringBuilder();
TagBuilder tag = new TagBuilder("a");
tag.AddCssClass("btn btn-default");  
using (var writer = new StringWriter())
{
  tag.WriteTo(writer, HtmlEncoder.Default);
  result.Append(writer.ToString());
}  

要设置InnerHtml,请使用Append() 方法,如下所示:

tag.InnerHtml.Append(i.ToString()); 

这种方式对我有用。

【讨论】:

    【解决方案2】:

    这与实现一种在后续页面上放置消息的方式有关 - 最初使用 Levilnis 的博客。

    无法在没有问题的情况下实现这一点,我退后一步寻找另一种方法。我使用了Mister James 提出的方法,特别是使用 baseController 来保存我所有可能的消息。我简化了一点,因为我不需要运行多条消息 - 每页只需要一条。

    public class BaseController : Controller
    {
        public void Success(string message, bool dismissable = false)
        {
            AddAlert(AlertStyles.Success, message, dismissable);
        }
    
        public void Information(string message, bool dismissable = false)
        {
            AddAlert(AlertStyles.Information, message, dismissable);
        }
    
        public void Warning(string message, bool dismissable = false)
        {
            AddAlert(AlertStyles.Warning, message, dismissable);
        }
    
        public void Danger(string message, bool dismissable = false)
        {
            AddAlert(AlertStyles.Danger, message, dismissable);
        }
    
        private void AddAlert(string alertStyle, string message, bool dismissable)
        {
            var alert = new Alert
            {
                AlertStyle = alertStyle,
                Message = message,
                Dismissable = dismissable
            };
    
             TempData.Put(Alert.TempDataKey, alert);
        }
    
    }
    

    有一个问题是,在 MVC6 中,您不能使用 Tempdata 发送复杂对象。这是使用@Hem 在Stackoverflow question 中的回答解决的,他建议使用将复杂对象转换为 json 字符串的扩展。为此,我确实没有添加 using “using Newtonsoft.Json;”。

    public static class TempDataExtensions
    {
        public static void Put<T>(this ITempDataDictionary tempData, string key, T value) where T : class
        {
            tempData[key] = JsonConvert.SerializeObject(value);
        }
    
        public static T Get<T>(this ITempDataDictionary tempData, string key) where T : class
        {
            object o;
            tempData.TryGetValue(key, out o);
            return o == null ? null : JsonConvert.DeserializeObject<T>((string)o);
        }
    }
    

    这现在就像一个魅力。

    【讨论】:

      猜你喜欢
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2010-10-16
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多