Предварительный выбор значения DropDownList не работает - PullRequest
1 голос
/ 03 мая 2011

Получена проблема с предварительным выбором значения для DropDownList. По сути, у меня есть класс ViewModel, который инкапсулирует исключение класса, который я не хочу создавать позже, и все возможные значения для DropDownList для выбора. Вот код

Модельные классы:

public abstract class Entity
{ 
    public virtual int Id { get; set; }        
}

public class Project : Entity
{
    public virtual string Name { get; set; }

    public virtual string Comments { get; set; }

    public virtual IList<Activity> Activities { get; set; }
}

public class Activity : Entity
{
    public virtual string Comments { get; set; }

    public virtual Project Project { get; set; }
}

ViewModel:

public class ActivityViewModel
{
    public Activity Instance { get; set; }

    public IList<Project> AllProjects { get; set; }
}

Вид:

@model Desk.Mvc3.Models.ActivityViewModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Activity</legend>
        <p>
            <input type="submit" value="Create" />
        </p>

        <div class="editor-label">
            @Html.LabelFor(model => model.Instance.Comments)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Instance.Comments)
            @Html.ValidationMessageFor(model => model.Instance.Comments)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.AllProjects)
        </div>
        <div class="editor-field">
            @Html.DropDownListFor(model => model.Instance.Project, 
                new SelectList(Model.AllProjects, "Id", "Name", Model.Instance.Project.Id ))
            @Html.ValidationMessageFor(model => model.AllProjects)
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

... и действие контроллера:

public class ActivityController : PersistanceController
{
    // ...

    //
    // GET: /Activity/Create/2

    public ActionResult Create(int projectId)
    {
        var projects = GetRep<Project>().GetAll();
        var activity = new Activity();
        activity.Project = projects.SingleOrDefault(p => p.Id == projectId);

        var item = new ActivityViewModel { 
            Instance = activity,
            AllProjects = projects };

        return View(item);
    }   
}

Почему при показе в браузере DropDownList заполняется элементом Project по умолчанию, а не предварительно заданным (то есть тем, который был назначен в методе Action)?

Ответы [ 2 ]

3 голосов
/ 03 мая 2011

Первый параметр в «DropDownListFor» предназначен для привязки, и это переопределяет выбранное вами значение.Вы используете объект «Project», но вместо этого вам придется использовать «Id» проекта.

@Html.DropDownListFor(model => model.Instance.Project.Id, 
        new SelectList(Model.AllProjects, "Id", "Name", Model.Instance.Project.Id ))

Если вы не хотите использовать это поведение, используйте помощник DropDownList.

Обновление (в ответ на ваш комментарий):

Есть способ заставить следующую работу.

@Html.DropDownListFor(model => model.Instance.Project, new SelectList(Model.AllProjects, "Id", "Name", Model.Instance.Project.Id ))            

Вам нужно будет переопределить "Функция ToString () "в классе« Project »возвращает значение« Id ».

public class Project : Entity  
{ 
    public virtual string Name { get; set; } 
    public virtual string Comments { get; set; } 
    public virtual IList<Activity> Activities { get; set; }

    public override string ToString()
    {
        return Id.ToString();
    }
}

Опять же, другим вариантом будет использование помощника DropDownList.

@Html.DropDownList("Instance.Project", 
        new SelectList(Model.AllProjects, "Id", "Name", Model.Instance.Project.Id ))

Thisбудет производить тот же HTML.

1 голос
/ 03 мая 2011

Я не знаю, какой метод доступа к базе данных вы используете, но я думаю, что Model.Instance.Project может быть нулевым после выхода из контроллера. Попробуйте передать выбранное значение через ViewData (или ViewBag):

public ActionResult Create(int projectId)
{
    var projects = GetRep<Project>().GetAll();
    var activity = new Activity();

    var selProj = projects.SingleOrDefault(p => p.Id == projectId);

    ViewData[SelectedProjectID] = selProj != null ? selProj.ID : -1;

    var item = new ActivityViewModel { 
        Instance = activity,
        AllProjects = projects };

    return View(item);
} 

Вид:

   @Html.DropDownListFor(model => model.Instance.Project, 
        new SelectList(Model.AllProjects, "Id", "Name", (int)ViewData[SelectedProjectID] ))

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...