2011-07-21 29 views
2

我有一個名爲LocalizedString的類,它是在我的asp.net mvc 3項目中引用的外部庫中定義的。爲什麼我在調用EditorForModel時忽略編輯器模板?

我在~\View\Shared\EditorTemplates文件夾中創建了一個名爲LocalizedString.cshtml的編輯器模板。

我有以下型號

public class Region 
{ 
    public LocalizedString Title { get; set; } 
} 

我有以下的測試頁:

@model Region 

@Html.EditorForModel() 
@Html.EditorFor(x => x.Title) 

LocalizedString編輯模板時,我打電話EditorForModel不會被調用,但它確實使我明確地請致電EditorFor(x => x.Title),以便我知道我沒有推薦問題。

爲什麼(或等值EditorFor(x => x))當調用EditorForModel忽略我的編輯模板

更新

我創建了一個新的項目,以重現此問題。我只使用默認的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() 

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()); 
     } 
    } 
} 

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; } 
    } 
} 

個LocalizedString.cs

namespace MvcApplication1.Models 
{ 
    public class LocalizedString 
    { 
     public LocalizedString() 
     { 
      this.Name = "LocalizedStringInstance"; 
     } 

     public string Name { get; set; } 
    } 
} 

如果你運行這個程序,輸出將只顯示該區域的名稱的文本輸入。內容永遠不會輸出LocalizedString.cshtml

我也嘗試使用UIHint而不是Region.Title屬性,但它仍然不顯示。

+0

這真的很奇怪。它應該基於你的描述工作。你在'LocalizedString'上試過'UIHint'嗎?您發佈的內容中沒有任何內容顯示錯誤可能在哪裏。 – Buildstarted

回答

5

轉出,這是同樣的問題Html.EditorForModel doesnt render complex types

默認情況下,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; 
} 

這是由ObjectTemplate叫發現在System.Web.Mvc.Html.DefaultEditorTemplates

在檢查IsComplexType的行爲之後,我發現如果某個類型無法通過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); 
    } 
} 
1

我們只是遇到了類似的問題。在開發環境中一切正常,但當構建安裝到測試環境中時,其中一個模板被忽略。事實證明,出於某種原因,該特定模板的屬性「構建行爲」是「無」而不是「內容」。沒有ides爲什麼這樣,但修復該設置解決了問題。

+0

謝謝。它只適用於此,否則它只是默默地失敗。 – GGleGrand

相關問題