7

首先,我是 MVC 和 ASP.NET 的新手,如果我遗漏了一些简单的东西,我深表歉意。

我正在开发一个代码优先的 MVC 5 应用程序,为了简洁起见,假设我有两个这样定义的模型:

public class Platform
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "You must select a manufacturer")]
    [DisplayName("Manufacturer")]
    public int ManufacturerId { get; set; }
    public virtual Manufacturer Manufacturer { get; set; }

    [Required(ErrorMessage="You must enter a name for the platform")]
    [StringLength(50, ErrorMessage="Reduce length to 50 characters or less")]
    public string Name { get; set; }
}

public class Manufacturer
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage="You must enter a name for the manufacturer")]
    [StringLength(50, ErrorMessage="Reduce length to 50 characters or less")]
    public string Name { get; set; }

    public virtual ICollection<Platform> Platforms { get; set; }
}

在为这些模型创建“带有视图的 MVC 5 控制器,使用实体框架”脚手架时,所有 CRUD 操作都正常工作。另一方面,表单元素没有格式化,缺少form-controlBootstrap 想要的类。

我可以通过添加一个带有类似内容的 EditorTemplate 来解决每种类型的@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @class = "form-control" })问题,但是 Bootstrap MVC 5 项目的脚手架肯定应该已经发出有效代码了吗?查看各种 MVC 5 教程,它们似乎可以在适当的样式下正常工作,所以我对自己做错了什么感到有些困惑。

作为参考,每个模型的 Create.cshtml 文件中的输出(为了简洁而剪辑到重要的表单元素)是:

<div class="form-group">
    @Html.LabelFor(model => model.ManufacturerId, "ManufacturerId", new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("ManufacturerId", String.Empty)
        @Html.ValidationMessageFor(model => model.ManufacturerId)
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>
</div>

<div class="form-group">
    @Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name)
    </div>
</div>

为什么在模型中设置ManufacturerIda 时将其指定为下拉菜单的标签文本DisplayName

为什么下拉使用DropDownList()而不是强类型DropDownListFor()

先感谢您。

4

2 回答 2

6

看起来 MVC 5.1 将为 Bootstrap 3 的表单控制问题提供解决方法,如此所述。可以为 EditorFor 传递样式。

于 2013-12-10T17:08:45.853 回答
5

听起来你做了我所做的 - 将 Bootstrap 2.x 升级到 3.0 或 3.0.1。Microsoft 项目模板基于 Bootstrap 2.x 而不是 3.x。您可以在GitHub 上了解其他人的 遭遇。

我还收到了来自 Microsoft 的 Rick Anderson 的回复,他在 www.asp.net 上写了几个教程,他证实了这一点......

很棒的收获。实际上,我教程中的一些图像来自 Beta 和 RC,它们使用的是 bootstrap v2,而不是 V3,因此我们的图像会有所不同。查看您的帐户控制器的视图以查看“表单控制”。您可以下载我的完整项目并与您的项目进行比较。

关于你的另一个问题,我遇到了同样的问题,并认为这可能是一个错误。某些注释似乎被忽略了。尝试向 Platform.ManufacturerId 添加 [ForeignKey()] 注释,看看它是否会影响字段标签。

于 2013-11-07T04:22:16.943 回答