如果斯科特艾伦可以使它工作......为什么我不能?应该是一个简单的下拉列表 - MVC3

1 asp.net-mvc model asp.net-mvc-3 drop-down-menu

几个星期以来,我一直在努力应该做一件非常简单的事情.我只是想在asp.net mvc 3 razor html页面中创建一个下拉列表,我希望下拉列表的数据来自模型.

我的模型如下所示,它位于Models.Project命名空间中.

public class Project
{
    public Project()
    {
        CategoryId = 0;
        Name = "";
        Description = "";
        //Categories = new Dictionary<int, string>();

        Entities _db = new Entities(); //ef4
        CateogoriesList = from c in _db.Categories 
                        orderby c.Name
                        select c.Name;
    }

    public int CategoryId { get; set; }

    [Required]
    [DataType(DataType.Text)]
    [Display(Name = "Project Name")]
    public string Name { get; set; }

    [Required]
    [DataType(DataType.MultilineText)]
    [Display(Name = "Project Description")]
    public string Description { get; set; }

    public IQueryable<string> CateogoriesList;

}
Run Code Online (Sandbox Code Playgroud)

我的控制器操作如下

public ActionResult Create()
{
    Models.Project.Project proj = new Models.Project.Project();
    return View(proj);
}
Run Code Online (Sandbox Code Playgroud)

我的Razor视图有以下相关代码......

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@model Models.Project.Project


@using (Html.BeginForm())
{
    @Html.ValidationSummary(true);

    <fieldset>
        <legend>Submit Your Request</legend>
        <div class="editor-label">@Html.LabelFor( Model => Model.CateogoriesList  )</div>
        <div class="editor-field">
            @Html.DropDownList("Category", new SelectList( Model.CateogoriesList ) )
        </div>
    </fieldset>
    <p><input type="submit" value="Send for RFP" /></p>
}
Run Code Online (Sandbox Code Playgroud)

问题是我收到以下错误...

Compiler Error Message: CS0135: 'Model' conflicts with the declaration 'System.Web.Mvc.WebViewPage<TModel>.Model'

我看到以下剪辑使它与ViewBag一起工作......我不明白为什么当我在模型中包含列表时它不起作用.

http://www.pluralsight-training.net/microsoft/players/PSODPlayer.aspx?author=scott-allen&name=mvc3-building-data-i&mode=live&clip=0&course=aspdotnet-mvc3-intro

我也看到有很多人似乎在这个简单的任务中遇到了麻烦,但在我的谷歌上搜索...我没有遇到任何人在尝试创建下拉列表时遇到同样的错误.

我很感激您或任何人可能提出的任何建议.我唯一想到的是SelectList构造函数接受一个类型的参数,System.Collections.IEnumerable我试图传递的是S ystem.Collections.Generic.IEnumerable...或接近它的东西......我不知道如何演员它恰当地......虽然我不认为我应该......如果它与一个视袋一起作为交通工具,为什么它不能用模型作为交通工具?

谢谢,

编辑:======================

问题在于selectList构造函数可以接受的对象类型.由于某种原因,它不会接受通用的IQueryable,但当我使用强制转换方法将实体框架的结果转换为Array时,它突然起作用.

所以我的模型变成......

公共类项目{public Project(){

    Riebro.RiebroEntities _db = new Riebro.RiebroEntities();
    CategoriesList = (from c in _db.Categories 
                    orderby c.Name
                    select c.Name).ToArray<string>();
}


[Display(Name = "Choose a category")]
public string[] CategoriesList;
Run Code Online (Sandbox Code Playgroud)

}

请注意查询结束时的.ToArray然后突然

@Html.DropDownList("Category", new SelectList(Model.CategoriesList))
Run Code Online (Sandbox Code Playgroud)

作品.虽然我打算在这里指出Model关键字似乎是必需的.

Dar*_*rov 6

在您的视图中,您使用:

@model Models.Project.Project
Run Code Online (Sandbox Code Playgroud)

而在您的控制器操作中,您通过:

public ActionResult Create()
{
    Riebro.Models.Project.Project proj = new Riebro.Models.Project.Project();
    return View(proj);
}
Run Code Online (Sandbox Code Playgroud)

请注意区别?Models.Project.ProjectVS Riebro.Models.Project.Project.您的控制器上似乎没有使用与视图相同的类型.

另请注意,使用包含类名称的命名空间名称是不好的做法.

另一个评论是在lambda表达式中使用Model关键字:

@Html.LabelFor(Model => Model.CateogoriesList)
Run Code Online (Sandbox Code Playgroud)

您不应该使用此关键字.用其他东西替换模型.