在使用WebForms多年后,我最近开始向MVC过渡。我正在尝试创建一个可插入的、轻量级的内容编辑模块,但遇到了一些问题。
这个想法很简单:创建一个名为EditableSimpleHtml的HtmlHelper,它可以在@using中使用。。。{}语法,以便在剃刀视图中实现以下内容:
@using (Html.EditableSimpleHtml("MyKey"))
{
<h3>Test</h3>
<p>
1<br />
</p>
}
{…}之间的值是在数据存储中找不到任何内容时的默认值。
我已经创建了一个HtmlHelper。以下是一个简化版本:
public static IDisposable EditableSimpleHtml(this HtmlHelper helper, string key)
{
// Get the content from the data storage using the key (I will not show the provider itself, its just a provider that will access a db)
var provider = ContentEditing.Provider;
string value = provider.GetValue(key);
if (value == null)
{
// No value found in the data storage for the supplied key, we have to use the default value from within the @using... { } statement
// Can I get that value here? I want to to store it initialy in the data storage
value = "..."; // How to get html from within the @using... { }?
}
return new ContentEditableHtmlString(helper, value);
}
public class ContentEditableHtmlString : IDisposable
{
private readonly HtmlHelper _helper;
public ContentEditableHtmlString(HtmlHelper helper, string value)
{
_helper = helper;
var builder = new TagBuilder("div");
var writer = _helper.ViewContext.Writer;
writer.Write(builder.ToString(TagRenderMode.StartTag));
writer.Write(value);
}
public void Dispose()
{
_helper.ViewContext.Writer.Write("</div>");
}
}
问题是我无法从@using中获取(默认)内容。。。HtmlHelper中的{}语句,或者至少我不知道怎么做。我需要它,以防我最初想将它存储到数据库中。
第二个问题是@using。。。将始终呈现{}语句。在可以从数据存储加载内容的情况下,我希望将默认值替换为数据存储中的值。
有没有办法实现这一点,或者我一开始就走上了一条完全错误的道路?
您不能像现在这样在@using{...}
语句中获取html。
你能做的最接近的事情就是使用Templated Razor Delegates
public static HelperResult EditableSimpleHtml(this HtmlHelper helper, string key,
Func<string, HelperResult> template)
{
var templateResult = template(null);
//you have your value here that you can return directly
//or you can return HelperResult to write to the response directly
var templateResultHtml = templateResult.ToHtmlString();
return new HelperResult(writer =>
{
templateResult.WriteTo(writer);
});
}
在你看来:
@Html.EditableSimpleHtml("MyKey", @<text>
<h3>Test</h3>
<p>@DateTime.Now</p>
</text>)