Pie*_*ant 2 c# razor asp.net-mvc-3
我有一个叫做的类LocalizedString,它是在我的asp.net mvc 3项目中引用的外部库中定义的.
我创建了一个LocalizedString.cshtml在~\View\Shared\EditorTemplates文件夹中调用的编辑器模板.
我有以下型号
public class Region
{
public LocalizedString Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有以下测试页面:
@model Region
@Html.EditorForModel()
@Html.EditorFor(x => x.Title)
Run Code Online (Sandbox Code Playgroud)
LocalizedString我调用时不调用编辑器模板EditorForModel,但是当我明确调用时它会渲染,EditorFor(x => x.Title)所以我知道我没有引用问题.
为什么我调用时忽略了我的编辑器模板EditorForModel(或其等价物EditorFor(x => x))
更新
我创建了一个新项目来重现这种行为.我刚刚使用了默认的ASP.NET MVC 3 Internet应用程序.
Index.cshtml
@model MvcApplication1.Models.Region
@{
ViewBag.Title = "Home Page";
}
<h2>@ViewBag.Message</h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)
HomeController.cs
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View(new Region());
}
}
}
Run Code Online (Sandbox Code Playgroud)
Region.cs
namespace MvcApplication1.Models
{
public class Region
{
public Region()
{
this.Name = "RegionInstance";
this.Title = new LocalizedString();
}
public string Name { get; set; }
public LocalizedString Title { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
LocalizedString.cs
namespace MvcApplication1.Models
{
public class LocalizedString
{
public LocalizedString()
{
this.Name = "LocalizedStringInstance";
}
public string Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
如果运行此程序,则输出将仅显示区域名称的文本输入.该LocalizedString.cshtml的内容从来没有输出.
我也试着使用UIHint过的Region.Title属性,但它仍然没有显示.
事实证明,这与Html.EditorForModel不呈现复杂类型的问题相同
默认情况下,ASP.NET MVC不会渲染子复杂类型,因为我通过反射找到了它
private static bool ShouldShow(ModelMetadata metadata, TemplateInfo templateInfo)
{
if (metadata.ShowForEdit && metadata.ModelType != typeof (EntityState) && !metadata.IsComplexType)
return !templateInfo.Visited(metadata);
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
这被称为ObjectTemplatein System.Web.Mvc.Html.DefaultEditorTemplates.
在检查了行为之后IsComplexType,我发现如果一个类型无法通过a转换为字符串,则该类型很复杂TypeConverter.如果我为我的子模型创建一个TypeConverter,它会渲染.虽然这个解决方案并不理想,但我可能会坚持使用EditorFor而不是EditorForModel.
using System;
using System.ComponentModel;
public class LocalizedStringTypeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
if (sourceType == typeof(string))
{
return true;
}
return base.CanConvertFrom(context, sourceType);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2211 次 |
| 最近记录: |