asp.net-mvc-3 - MvcScaffold 没有正确创建我的相关下拉列表

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

MvcScaffold 版本:0.9.7

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

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

正如您将看到的那样,“文本”被显示为与“值”相同。

显然,我每次都可以通过以下方式手动重新修改此代码:
Text = Html.DisplayTextFor(_ => option.LocationName).ToString(), 

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

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

谢谢保罗

最佳答案

我相信问题是 MvcScaffolding 不知道什么属性应该代表您的文本字段。模板尝试在它认为可能代表具有代表“文本”属性的值的列的类中查找候选属性。我看过代码,它会查找“名称”、“标题”等内容。如果找到其中之一,它将使用该字段作为文本属性。这是它使用的实际代码:
static string[] displayPropertyNames = new[] { "Name", "Title", "LastName", "Surname", "Subject", "Count" };
它将使用它找到的第一个,如果它根本没有找到任何你得到你当前拥有的代码。这并不理想,因为您可能没有这些名称中的任何一个和/或您可能有一个具有这些名称之一的字段,但可能不希望它代表下拉列表中的文本值。

应该解决此问题的另一个选项是创建一个部分类并在您绑定(bind)到下拉列表的模型类型上附加一个 DisplayColumn 属性。例如:
[DisplayColumn("LocationName")] public partial class DropDownBoundType {}
然而,我发现部分类的实现导致了一些其他问题,其中 MvcScaffolding 生成器停止将字段识别为关联键。因此,在某些情况下,它会生成文本框,而不是下拉菜单。不确定问题是什么,也许它不会影响你,但不幸的是,我正在谨慎行事。

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

关于asp.net-mvc-3 - MvcScaffold 没有正确创建我的相关下拉列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5261087/

相关文章:

asp.net - DropDownList对于未选择值的集合

.net - 在asp.net mvc中实现忘记密码功能的一些问题

c# - 谁应该了解 Asp.Net MVC 中的页面标题?

ruby-on-rails - rspec 触发器 "DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically."

templates - 一个应用程序中存在多个 Grails 脚手架模板

asp.net-mvc - 将 mvc3 中的下拉列表绑定(bind)到字典?

asp.net-mvc-3 - mvc3 razor 条件包装 div

c# - 使用变量来引用局部 View 的位置

razor - 如何使用 CLI 搭建 Razor 页面支架?

c# - 不显眼的验证 C# MVC Razor