Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Kevin DondeОтветов: 3

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

modeldrop-down-menu

Ответы

Ответ 1 · рейтинг 1 · Vincent

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

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

Ответ 2 · рейтинг 6 · Darin Dimitrov

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

@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)

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

Ответ 3 · рейтинг 1 · GeertvdC

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

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

попробуй это

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы