我在我的模型上使用HtmlString属性,如此
public HtmlString Html { get; set; }
然后我有一个EditorTemplate渲染和html编辑器,但是当我使用TryUpdateModel()时,我得到一个InvalidOperationException,因为没有类型转换器可以在这些类型String和HtmlString之间进行转换。
我是否需要创建自定义模型绑定器,还是有其他方式?
更新
我正在尝试在我的模型上使用HtmlString,主要是为了明确它包含HTML。 所以这就是我的完整模型:
public class Model {
public HtmlString MainBody { get; set; }
}
这就是我呈现表单的方式:
@using (Html.BeginForm("save","home")){
@Html.EditorForModel()
<input type="submit" name="submit" />
}
我创建了自己的编辑器模板Object.cshtml,以便可以将字段MainBody呈现为textarea。
我的控制器有一个Save方法,如下所示:
public void Save([ModelBinder(typeof(FooModelBinder))]Model foo) {
var postedValue = foo.MainBody;
}
正如您所看到的,我一直在使用如下所示的自定义模型绑定器:
public class FooModelBinder : DefaultModelBinder {
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder) {
if (propertyDescriptor.PropertyType == typeof(HtmlString)) {
return new HtmlString(controllerContext.HttpContext.Request.Form["MainBody.MainBody"]);
}
return null;
}
}
这按预期工作但我不知道如何从bindingContext获取完整的ModelName,因为bindingContext.ModelName只包含MainBody而不包含MainBody.MainBody?
我也对其他解决方案感兴趣,或者如果有人认为这是一个非常糟糕的主意。
答案 0 :(得分:2)
我是否需要创建自定义模型绑定器
是的,如果您想在视图模型上使用HtmlString
属性,因为此类没有无参数构造函数,并且默认模型绑定器不知道如何实例化它。
还是有另一种方式吗?
是的,不要在视图模型上使用HtmlString
属性。可能还有其他方式。不幸的是,因为您提供了关于您的背景的严格0信息以及您正在努力实现的目标,所以我们可以为您提供帮助。
更新:
现在您已经在这里展示了一小段代码。
型号:
public class Model
{
public HtmlString MainBody { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new Model());
}
[HttpPost]
public ActionResult Index([ModelBinder(typeof(FooModelBinder))]Model foo)
{
var postedValue = foo.MainBody;
return Content(postedValue.ToHtmlString(), "text/plain");
}
}
模型绑定器:
public class FooModelBinder : DefaultModelBinder
{
protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
{
if (propertyDescriptor.PropertyType == typeof(HtmlString))
{
return new HtmlString(bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue);
}
return null;
}
}
查看(~/Views/Home/Index.cshtml
):
@using (Html.BeginForm())
{
@Html.EditorForModel()
<input type="submit" name="submit" />
}
自定义对象编辑器模板,以便进行深入研究(~/Views/Shared/EditorTemplates/Object.cshtml
):
@foreach (var property in ViewData.ModelMetadata.Properties.Where(x => x.ShowForEdit))
{
if (!string.IsNullOrEmpty(property.TemplateHint))
{
@Html.Editor(property.PropertyName, property.TemplateHint)
}
else
{
@Html.Editor(property.PropertyName)
}
}
要呈现为textarea(HtmlString
)的~/Views/Shared/EditorTemplates/HtmlString.cshtml
类型的自定义编辑器模板:
@Html.TextArea("")
顺便说一下,我仍然不明白你为什么要使用HtmlString作为属性而不是简单的字符串,但无论如何。