字符串的ASP.NET MVC显示模板用于整数
我最近遇到了ASP.NET MVC显示模板的问题。 说这是我的模特:
public class Model
{
public int ID { get; set; }
public string Name { get; set; }
}
这是控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new Model());
}
}
这是我的观点:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<DisplayTemplateWoes.Models.Model>" %>
<!DOCTYPE html>
<html>
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<%: Html.DisplayForModel() %>
</div>
</body>
</html>
如果我出于某种原因需要所有字符串的显示模板,我将创建一个String.ascx局部视图,如下所示:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<%: Model %> (<%: Model.Length %>)
这里是问题 - 在运行时抛出下面的异常:“传入字典的模型项是'System.Int32'类型,但是这个字典需要一个'System.String'类型的模型项”
看起来String.ascx用于Model类的整数和字符串属性。 我期望它只用于字符串属性 - 毕竟它被命名为String.ascx而不是Object.ascx或Int32.ascx。
这是设计吗? 如果是 - 是否在某处记录? 如果没有 - 它可以被认为是一个错误?
这似乎是设计。 你将不得不使字符串模板更一般化。 对于没有自己的模板的每个非复杂模型,字符串模板都作为默认模板。
字符串的默认模板(FormattedModelValue是对象):
internal static string StringTemplate(HtmlHelper html) {
return html.Encode(html.ViewContext.ViewData.TemplateInfo.FormattedModelValue);
}
模板选择如下所示:
foreach (string templateHint in templateHints.Where(s => !String.IsNullOrEmpty(s))) {
yield return templateHint;
}
// We don't want to search for Nullable<T>, we want to search for T (which should handle both T and Nullable<T>)
Type fieldType = Nullable.GetUnderlyingType(metadata.RealModelType) ?? metadata.RealModelType;
// TODO: Make better string names for generic types
yield return fieldType.Name;
if (!metadata.IsComplexType) {
yield return "String";
}
else if (fieldType.IsInterface) {
if (typeof(IEnumerable).IsAssignableFrom(fieldType)) {
yield return "Collection";
}
yield return "Object";
}
else {
bool isEnumerable = typeof(IEnumerable).IsAssignableFrom(fieldType);
while (true) {
fieldType = fieldType.BaseType;
if (fieldType == null)
break;
if (isEnumerable && fieldType == typeof(Object)) {
yield return "Collection";
}
yield return fieldType.Name;
}
}
所以如果你只想为字符串创建模板,你应该这样做(String.ascx):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<object>" %>
<% var model = Model as string; %>
<% if (model != null) { %>
<%: model %> (<%: model.Length %>)
<% } else { %>
<%: Model %>
<% } %>
链接地址: http://www.djcxy.com/p/50829.html
上一篇: ASP.NET MVC Display Template for strings is used for integers
下一篇: Overwrite single file in my current branch with the same file in the master branch?