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

Я боролся с тем, что должно быть очень простой вещью уже несколько недель.Я просто хочу создать выпадающий список на 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

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

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

Спасибо,

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

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

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

открытый класс Project {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;

}

обратите внимание на массив .ToArray наконец запроса, а затем внезапно

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

работает.Хотя я собираюсь указать на то, что здесь требуется ключевое слово Model.

Ответы [ 3 ]

6 голосов
/ 16 июня 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)

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

1 голос
/ 17 июня 2011

Посмотри свой код, что это?Вот причина причины ошибки.

  <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>
}
1 голос
/ 16 июня 2011

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

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

попробуйте это

<div class="editor-label">@Html.LabelFor( m=> m.CateogoriesList  )</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...