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

时间:2011-06-16 07:08:46

标签: asp.net-mvc asp.net-mvc-3 model drop-down-menu

我几周来一直在努力解决一件非常简单的问题。我只是想在asp.net mvc 3 razor html页面中创建一个下拉列表,我希望下拉列表的数据来自模型。

My Model如下所示,位于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;

}

我的控制器操作如下

public ActionResult Create()
{
    Models.Project.Project proj = new Models.Project.Project();
    return View(proj);
}

我的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>
}

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

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时,它突然起作用。

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

公共类项目 {     公共项目()     {

    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;

}

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

@Html.DropDownList("Category", new SelectList(Model.CategoriesList))

的工作原理。虽然我打算在这里指出Model关键字似乎是必需的。

3 个答案:

答案 0 :(得分:6)

在您的视图中,您使用:

@model Models.Project.Project

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

public ActionResult Create()
{
    Riebro.Models.Project.Project proj = new Riebro.Models.Project.Project();
    return View(proj);
}

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

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

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

@Html.LabelFor(Model => Model.CateogoriesList)

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

答案 1 :(得分:1)

您在lambda表达式中使用保留关键字Model

<div class="editor-label">@Html.LabelFor( Model => Model.CateogoriesList  )</div>

试试这个

<div class="editor-label">@Html.LabelFor( m=> m.CateogoriesList  )</div>

答案 2 :(得分:1)

查看您的代码,那是什么?这就是导致错误的原因。

  <div class="editor-label">@Html.LabelFor( Model => Model.CateogoriesList  )</div>

纠正一个

      <div class="editor-label">@Html.LabelFor( Model => Model.CategoryId  )</div>

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

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

这是我对你的实体的模拟。我只是添加另一个用于模拟IQueryable对象的CategoriesList2,但它仍在工作。

    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;
        //IQueryable<string> categoriesList = (new string[] { }).AsQueryable();
        CateogoriesList = new string[] { "abc", "def", "hij", "klm" };
        CategoriesList2 = (new string[] { "abc", "def", "hij", "klm" }).AsQueryable();
    }

    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 string[] CateogoriesList;

    public IQueryable<string> CategoriesList2;

}

以下是使用IQueryable类别列表的视图

@model MvcApplication3.Models.Project


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

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