Если Скотт Аллен может заставить это работать, почему я не могу? Должен быть простой выпадающий список - MVC3

Уже несколько недель я борюсь с тем, что должно быть очень просто. Я просто хочу создать раскрывающийся список на html-странице asp.net mvc 3 razor и хочу, чтобы данные для раскрывающегося списка исходили из модели.

Моя модель выглядит следующим образом: она находится в пространстве имен 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

Я также видел, что есть много людей, у которых, кажется, есть проблемы с этой простой задачей, но в моем поиске в Google ... Я не встречал никого с такой же ошибкой при попытке создать раскрывающийся список.

Я был бы признателен за любые предложения, которые вы или кто-либо может иметь. Единственное, что я придумал, так это то, что конструктор SelectList принимает параметр типа System.Collections.IEnumerable и то, что я пытаюсь ему передать, это System.Collections.Generic.IEnumerable... или что-то близкое к нему... и я не знаю, как чтобы отлить его соответствующим образом ... хотя я не думаю, что мне нужно ... если он работает с сумкой для просмотра в качестве средства передвижения, почему это не работает с моделью в качестве средства передвижения?

Спасибо,

РЕДАКТИРОВАТЬ: ======================

Проблема заключалась в типе объекта, который мог бы принять конструктор selectList. По какой-то причине он не принял бы общий IQueryable, но когда я привел результат из структуры сущностей, используя метод расширения приведения toArray, он внезапно сработал.

Так моя модель становится...

проект открытого класса { общественный проект () {

    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 кажется обязательным.


person Kevin Donde    schedule 16.06.2011    source источник


Ответы (3)


Видишь свой код, что это? это причина, вызывающая ошибку.

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

Вот моя симуляция вашей сущности. Я просто добавляю еще один CategoriesList2, который используется для имитации объекта IQueryable, но он все еще работает.

    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>
}
person Vincent    schedule 17.06.2011
comment
Привет, Винсент. Это тоже не проблема. Я сделал модификацию, как вы предложили, но это не так. Проблема именно в этой строке @Html.DropDownList(Category, new SelectList(x.CateogoriesList)) - person Kevin Donde; 18.06.2011
comment
Привет, Кевин, ты невнимательно посмотрел видео или у этого видео нет ярлыка для этого раскрывающегося списка. Я создал вашу демонстрацию на моей локальной машине. Мой ответ правильный. Пожалуйста, внимательно прочитайте мой ответ, вы можете либо удалить этот ярлык, чтобы увидеть, работает он или нет. В противном случае я могу отправить вам свой тестовый проект, в котором все точно так же, как и в вашем (за исключением того, что я использую строковый массив вместо IQuerable для categoryList). После изменения метки на CategoryId все работает. Смотрите мой ответ с новым кодом - person Vincent; 18.06.2011
comment
Привет Винсент ... Он определенно использует другой тип для создания раскрывающегося списка. Я извлекаю данные из базы данных с помощью Entity Framework 4. Поэтому я, естественно, получаю объект IQueryable. Если проблема связана с типом, который я использую... как преобразовать IQueryable‹string› в более простой объект, который может принять конструктор раскрывающегося списка? Следующий запрос показывает, как я извлекаю данные... CateogoriesList = from c in _db.Categories orderby c.Name select c.Name; - person Kevin Donde; 18.06.2011
comment
Таким образом, ответ был конкретно связан с типом объекта, который примет конструктор SelectList. Я отредактирую свой оригинальный пост с ответом. - person Kevin Donde; 18.06.2011
comment
Рад видеть, что ты наконец заработал. Я просто делаю еще одну попытку, с типом все в порядке, даже если вы возвращаете IQuerable, он все еще работает. Я опубликую свой код в разделе ответов. - person Vincent; 19.06.2011

По вашему мнению, вы используете:

@model Models.Project.Project

тогда как в вашем действии контроллера вы передаете:

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

Заметили разницу? Models.Project.Project против Riebro.Models.Project.Project. Похоже, вы не используете тот же тип на своем контроллере, что и в вашем представлении.

Также обратите внимание, что использование имен пространств имен, содержащих имя класса, является плохой практикой.

Еще одно замечание касается использования ключевого слова Model в лямбда-выражениях:

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

Вы не должны использовать это ключевое слово. Замените модель чем-то другим.

person Darin Dimitrov    schedule 16.06.2011
comment
Привет, разница между моим контроллером и моим представлением была ошибкой в ​​моем посте. Я исправил это. Я пытался упростить его, не добавляя дополнительный уровень, который на самом деле является просто названием и ничего не значит. Я проверил, и то, что я передаю от контроллера в свое представление, и модель, которую я указываю в своем представлении, идентичны. Я также изменил все слова модели на x, поэтому вместо .... @Html.LabelFor(Model => Model.CateogoriesList) у меня есть ... @Html.LabelFor( x => x.CateogoriesList) - person Kevin Donde; 17.06.2011
comment
Я также попробовал это для фактического раскрывающегося списка, где я получаю ошибку компиляции. @Html.DropDownList(Category, new SelectList(x.CateogoriesList)) но у меня все та же проблема. Сообщение об ошибке компилятора: CS0135: «Модель» конфликтует с объявлением «System.Web.Mvc.WebViewPage‹TModel›.Model». Я не уверен, почему я получаю сообщение об ошибке, но я все еще получаю. - person Kevin Donde; 17.06.2011

Вы используете зарезервированное ключевое слово Model в своем лямбда-выражении.

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

попробуй это

<div class="editor-label">@Html.LabelFor( m=> m.CateogoriesList  )</div>
person GeertvdC    schedule 16.06.2011
comment
Привет, я попробовал предложение, упомянутое в комментарии выше, но оно не сработало. Я считаю, что проблема заключается в фактической строке, в которой я создаю раскрывающийся список. - person Kevin Donde; 17.06.2011
comment
если вы все еще получаете ту же ошибку, я бы проверил, используете ли вы модель ключевого слова где-либо еще в своем коде неправильно. - person GeertvdC; 17.06.2011
comment
Спасибо, Geertvdc, на самом деле я сейчас нигде не использую ключевое слово «Модель». Он даже не появляется ни разу, кроме как в операторе @model. - person Kevin Donde; 18.06.2011