Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
外键的.net mvc razor下拉列表_.net_Asp.net Mvc 3_Entity Framework 4.1_Ef Code First_Viewmodel - Fatal编程技术网

外键的.net mvc razor下拉列表

外键的.net mvc razor下拉列表,.net,asp.net-mvc-3,entity-framework-4.1,ef-code-first,viewmodel,.net,Asp.net Mvc 3,Entity Framework 4.1,Ef Code First,Viewmodel,好吧,这看起来很简单,但让我头晕目眩 我已经基于CodeFirst创建了模型 public class Category { public int ID { get; set; } [StringLength(255, MinimumLength = 1)] public string Name { get; set; } } public class SubCategory { public int ID { get; set; } public C

好吧,这看起来很简单,但让我头晕目眩

我已经基于CodeFirst创建了模型

public class Category
{
    public int ID { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}

public class SubCategory
{
    public int ID { get; set; }
    public Category category { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}
现在,当我为子类别自动生成控制器和视图时,它(开箱即用)允许我在不指定类别的情况下创建新的子类别对象(即使它正确地创建了与数据库中的类别表的外键关系)

所以我想好了,我会在create.cshtml文件中下拉一个下拉列表,让它使用它

一段时间后,我成功地将此添加到控制器:

    public ActionResult Create()
    {
        ViewBag.Categories = new SelectList(db.Category.ToList(),"ID","Name");
        return View();
    } 
这一观点:

    @Html.DropDownList(model => model.category, "Categories")
但是现在,对象不会自动捕获我想要将其用于外键的内容,因此当我在POST方法中停止代码时,它仍然会在category字段中显示空值的对象

我想我的问题是双重的。我该怎么做?如果到目前为止我的方法是正确的,我还缺少什么

我只希望保存到子类别表的新对象包含类别的外键


希望这是有意义的。

最简单的方法是在
子类别
类中定义一个名为
CategoryId
的标量属性

public class SubCategory
{
    public int ID { get; set; }

    public int CategoryID { get; set; }
    public Category category { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}
然后在EF中正确地映射它

然后你把

@Html.DropDownListFor(
    model => model.CategoryID, category SelectList instance)
)

另一个选项是创建自定义模型绑定器以绑定
类别
类型。

最简单的方法是在
子类别
类中定义名为
类别ID
的标量属性

public class SubCategory
{
    public int ID { get; set; }

    public int CategoryID { get; set; }
    public Category category { get; set; }

    [StringLength(255, MinimumLength = 1)]
    public string Name { get; set; }
}
然后在EF中正确地映射它

然后你把

@Html.DropDownListFor(
    model => model.CategoryID, category SelectList instance)
)

另一个选项是创建一个自定义模型绑定器来绑定
Category

类型。

很抱歉,我试图按照此操作,但我遇到了问题:@Html.DropDownList(model=>model.CategoryID,“Categories”),错误:CS1660:无法将lambda表达式转换为类型'string',因为它不是委托类型'..@Asinox您必须将包含
Categories
的实例作为第二个参数传递。很抱歉,我试图遵循此操作,但我遇到了以下问题:@Html.DropDownList(model=>model.CategoryID,“Categories”),错误:CS1660:无法将lambda表达式转换为类型“string”,因为它不是委托类型“…..@Asinox您必须将包含
类别的实例作为第二个参数传递