2011-02-18 59 views
7

我最近遇到了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。

這是設計嗎?如果是 - 是否在某處記錄?如果沒有 - 它可以被認爲是一個錯誤?

回答

4

這似乎是由設計。你將不得不使字符串模板更一般化。對於沒有自己的模板的每個非複雜模型,字符串模板都作爲默認模板。字符串

默認模板(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; 
    } 
} 

所以,如果你想只爲字符串創建模板,你應該做的像this(String.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<object>" %> 

<% var model = Model as string; %> 
<% if (model != null) { %> 
    <%: model %> (<%: model.Length %>) 
<% } else { %> 
    <%: Model %> 
<% } %>