У меня была та же самая дилемма. Попробуйте создать тип модели представления со свойством Func, а затем передайте HTML как делегат.
public class ContainerViewModel
{
public String Caption { get; set; }
public String Name { get; set; }
public Int32 Width { get; set; }
public Func<object, IHtmlString> Content { get; set; }
}
@Html.Partial("Container", new ContainerViewModel()
{
Name = "test",
Caption = "Test container",
Content =
@<text>
<h1>Hello World</h1>
</text>,
Width = 600
})
Вы можете назвать это так в своей части.
@Model.Content(null)
Если вы хотите быть модным, вы можете добавить этот метод расширения.
public static class PartialExtensions
{
public static IHtmlString Display<T>
(this T model, Expression<Func<T, Func<Object, IHtmlString>>> content)
{
var compiled = content.Compile();
return compiled.Invoke(model).Invoke(null);
}
}
Затем, каждый раз, когда вы используете этот шаблон, вы можете назвать его таким образом в своей части (не полностью протестированной).
@model ContainerViewModel
@Model.Display(m => m.Content) // Use delegate property
Надеюсь, это работает для вас.
Это работает, потому что синтаксис @ ... создает для вас небольшой HtmlHelper, который использует модель (которую вы объявляете здесь как тип object
, и передаете null
для) и возвращает IHtmlString
.
Осторожно, значения форм не отправляются на сервер, если в содержимом используется @ Html.BeginForm.
Поэтому оберните свою форму вокруг контейнера.