尝试从Levelnis的Blog中实现消息类时出现编译错误。
有问题的课程是:
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中的实现方式是否有所不同?如果没有,有人会建议采用另一种方式来实现这些方法吗?
答案 0 :(得分:1)
似乎TagBuilder在MVC6中的工作方式与在MVC5中的工作方式不同。
而不是ToString()
方法使用StringWriter
和WriteTo()
方法,如下所示:
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());
这种方式对我有用。
答案 1 :(得分:0)
这与实现在后续页面上放置消息的方式有关 - 最初使用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发送复杂的对象。这是在Stackoverflow question中使用@Hem的答案解决的,他建议使用扩展将复杂对象转换为json字符串。为了实现这一点,我确实使用了“使用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);
}
}
这就像魅力一样。