MvcScaffold没有正确创建我的相关下拉列表

时间:2011-03-10 14:30:33

标签: asp.net-mvc-3 razor scaffolding ef-code-first scaffold

MvcScaffold版本:0​​.9.7

好的,所以MvcScaffold在我的_CreateOrEdit.cshtml局部视图中为我生成了这段代码:

<div class="editor-field">
    @Html.DropDownListFor(model => model.LocationId, ((IEnumerable<JobSite.Models.Location>)ViewBag.PossibleLocations).Select(option => new SelectListItem {
        Text = Html.DisplayTextFor(_ => option).ToString(), 
        Value = option.LocationId.ToString(),
        Selected = (Model != null) && (option.LocationId == Model.LocationId)
    }), "Choose...")
    @Html.ValidationMessageFor(model => model.LocationId)
</div>

然而,这会生成以下HTML:

<select data-val="true" data-val-number="The field LocationId must be a number." data-val-required="The LocationId field is required." id="LocationId" name="LocationId"><option value="">Choose...</option>
     <option value="1">1</option>
     <option value="2">2</option>
</select>

正如您将看到的那样,“drowndown”文本显示的内容与“value”相同。

显然,我每次都可以通过以下方式手动重新触摸此代码:

Text = Html.DisplayTextFor(_ => option.LocationName).ToString(), 

...但我想解决这个问题以避免这种情况。

有人可以提供任何指导吗?

谢谢保罗

1 个答案:

答案 0 :(得分:1)

我认为问题是MvcScaffolding不知道什么属性应该代表你的文本字段。模板尝试在类中找到它认为可能代表具有代表“text”属性的值的列的候选属性。我已经看过代码,它会查找“Name”,“Title”等内容。如果找到其中一个,它将使用该字段作为text属性。以下是它使用的实际代码:

static string[] displayPropertyNames = new[] { "Name", "Title", "LastName", "Surname", "Subject", "Count" };

它将使用它找到的第一个,如果它找不到任何你得到你当前的代码。这并不理想,因为您可能没有这些名称和/或您可能有一个具有其中一个名称的字段,但可能不希望它代表下拉列表中的文本值。

应该解决此问题的另一个选项是创建一个部分类,并在绑定到下拉列表的模型类型上附加DisplayColumn属性。例如:

[DisplayColumn("LocationName")] public partial class DropDownBoundType {}

然而,我发现部分类的实现导致一些其他问题,其中MvcScaffolding生成器停止将字段识别为关联键。因此,在某些情况下,它不会产生下拉,而是会生成文本框。不确定问题是什么,也许它不会对你产生影响,但不幸的是,这种行为让我非常谨慎。

此外,我注意到你正在运行9.7并且有一个新版本可用9.8。我不认为它解决了你的问题,但它解决了其他问题。可能值得花时间继续更新它。