1

我用 EF 创建了一个 MVC4 应用程序,我有两个简单的类,Brand 和 CarModel,Brand 有一个名称(必需)和 CarModel 有一个 Brand(必需)。问题是我在 ModelState.IsValid 上遇到错误,因为通过下拉菜单选择品牌,它只填写品牌 ID。

我怎样才能在品牌名称中留下所需但能够使用 CarModel 中的下拉菜单?这是我的代码:

    public class Brand
    {


        public int Id { get; set; } 
        [Required]       
        public string Name { get; set; }
        public string Logo { get; set; }

    }

    public class CarModel
    {
        public int Id { get; set; }
        [Required]
        public string Name{ get; set; }
        [Required]
        public Brand Brand{ get; set; }
    }

我有完整的 Crud for Brand 工作正常。但是我正在尝试为 CarModel 做这件事,这是我在控制器中用于创建品牌的内容:

 public ActionResult Create()
        {
            ViewBag.BrandSelect = new SelectList(myRepository.GetBrands.ToList(), "Id", "Name");
            return View();
        }

  [HttpPost]
        public ActionResult Crear(CarModel carModel )
        {

            if (ModelState.IsValid)
            {



                myrepository.Create(Modelo);
                return RedirectToAction("Index");
            }


            return View(carModel );
        }

并且在视图中

<div class="editor-label">
            @Html.LabelFor(model => model.Brand)
        </div>
        <div class="editor-field">

            @Html.DropDownListFor(model => model.Brand.Id,ViewBag.BrandSelect as SelectList)
            @Html.ValidationMessageFor(model => model.Brand)
        </div>
4

2 回答 2

2

如果我理解正确,您的 CarModel 类应该有一个 BrandId (int) 和一个 Brand 对象。

public class CarModel
{
    public int Id { get; set; }
    [Required]
    public string Name{ get; set; }
    [Required]
    public int BrandId { get; set; }


    public Brand Brand{ get; set; }
}

您的 DropDownList 应该绑定到 BrandId

        @Html.DropDownListFor(model => model.BrandId, ViewBag.BrandSelect as SelectList)
        @Html.ValidationMessageFor(model => model.Brand)

更多 EF 代码 First Paren-Child

于 2013-04-01T01:33:43.580 回答
1

您有一个预先填充的项目BrandSelect,这意味着它Brand.Id保证存在于数据库中。此外,Brand当您创建CarModel. 因此,您可以使用一个视图模型来代表您CarModel的视图并将其返回到您的视图中,这是最佳实践。考虑一下:

你的模型

public class CarFormModel // this is a "model class" and not your entity
{
    public int Id { get; set; }
    [Required]
    public string Name{ get; set; }
    [Required]
    public int BrandId { get; set; }
    //replacement for your ViewBag.BrandSelect
    //you can also create a viewmodel for this
    //but let's use your entity for a more simple example
    public IEnumerable<Brand> Brands {get;set;}
}

您的控制器,用于 GET 方法

public ActionResult Create()
{
    var model = new CarFormModel {
        Brands = get_brands_from_database(),
    }
    return View(model);
}

你的看法

@model CarFormModel
<div class="editor-field">
    @Html.TextboxFor(model => model.Name) // capture the name of the car model
<div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.BrandId, new SelectList(Model.Brands,  "Id", "Name", Model.BrandId)) // capture the brand for the car model
    @Html.ValidationMessageFor(model => model.BrandId)
</div>

您的控制器,用于 POST 方法

[HttpPost]
public ActionResult Create(CarFormModel carModel)
{
    if (ModelState.IsValid) {
        // map the model back to entity or pass it to your service that creates the model
        myrepository.Create(the_mapped_or_created_carmodel_entity);
        return RedirectToAction("Index");
    }

    return View(carModel);
}

此选项比您现在拥有的更好,因为您没有使用 ViewBag 作为下拉菜单,并且您没有在视图上公开代理对象。一个好的做法是始终在您的视图上使用视图模型。

于 2013-04-01T01:34:32.193 回答