Ответ 1
У меня была та же самая дилемма. Попробуйте создать тип модели представления со свойством 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.
Поэтому оберните свою форму вокруг контейнера.