2013-05-16 78 views
0

我使用通用Razor視圖來允許編輯任何實體框架對象。下面是它的一個砍下版本:@ Html.Editor在使用反射屬性時顯示奇怪的結果

@model Object 
@using (Html.BeginForm()) 
{ 
     @foreach (var property in Model.VisibleProperties()) 
     { 
      @Html.Label(property.Name.ToSeparatedWords()) 
      @Html.Editor(property.Name, new { @class = "input-xlarge" }) 
     } 
} 

而且VisibleProperties()函數是這樣的:

public static PropertyInfo[] VisibleProperties(this Object model) 
     { 
      return model.GetType().GetProperties().Where(info => 
       (info.PropertyType.IsPrimitive || info.PropertyType.Name == "String") && 
       info.Name != model.IdentifierPropertyName()).OrderedByDisplayAttr().ToArray(); 
     } 

(我是從​​重用代碼)

我的一個樣本控制器如下:

public ActionResult Edit(int id = 0) 
     { 
      TaskTemplate tasktemplate = db.TaskTemplates.Single(t => t.TaskTemplateID == id); 
      return View(tasktemplate); 
     } 

現在問題: 除了有一個與'父'表相關的ID屬性(如UserID)之外,它一切正常。對於這些字段,@ Html.Editor的輸出很簡單: FalseFalseTrueFalse。

True似乎對應於有問題的用戶 - 在本例中是數據庫中的第4個用戶。

爲什麼它不輸出一個不錯的帶有數字4(或任何UserID)的文本框?

我希望我已經解釋清楚。

回答

1

原因是編輯器/顯示模板沒有遞歸到複雜的子對象中。如果您希望發生這種情況,您可以編寫一個自定義編輯器模板(~/Views/Shared/Object.cshtml),如Brad Wilson在this blog post(更具體地說是Shallow Dive vs. Deep Dive部分)中所示。

所以:

<table cellpadding="0" cellspacing="0" border="0"> 
@foreach (var prop in ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForEdit && !ViewData.TemplateInfo.Visited(pm))) 
{ 
    if (prop.HideSurroundingHtml) 
    { 
     @Html.Editor(prop.PropertyName) 
    } 
    else 
    { 
     <tr> 
      <td> 
       <div class="editor-label" style="text-align: right;"> 
        @(prop.IsRequired ? "*" : "") 
        @Html.Label(prop.PropertyName) 
       </div> 
      </td> 
      <td> 
       <div class="editor-field"> 
        @Html.Editor(prop.PropertyName) 
        @Html.ValidationMessage(prop.PropertyName, "*") 
       </div> 
      </td> 
     </tr> 
    } 
} 
</table> 
+0

嗯,我不知道這就是我要找的。我仍然不明白爲什麼它不會將FirmID顯示爲可編輯的整數值?畢竟,這是財產是不是?奇怪的是,我也有一個索引控制器和視圖,它使用IEnumerable來顯示所有的屬性。在這種情況下,它工作正常並且完美地呈現整數值。 – rwalter

+0

正如我在默認情況下的回答所解釋的那樣,'Html.Editor'幫手不會遞歸到複雜的子屬性中。如果您希望發生這種情況,您必須爲對象類型編寫自定義編輯器模板。 –

+0

對不起 - 仍然不明白!數據庫中的FirmID只是一個「int」。也許問題是:如果我只想讓'int'出來,我該如何阻止MVC將它看作一些複雜的值?有什麼我可以使用LINQ或dbcontext來阻止這種情況發生嗎?我知道這是可能的,因爲我的其他代碼使用了「Enumerable」對象列表。在這種情況下,'int'被正確地返回。 – rwalter