2011-05-03 3 views
1

DropDownList의 값을 미리 선택하는 데 문제가 있습니다. 기본적으로 나중에 작성할 수없는 클래스의 isntance 및 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; } 
} 

뷰 모델 :

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> 
} 
... 그리고 컨트롤러의 작업 :

,

브라우저 내부에 표시되는 경우 DropDownList가 프리젠 테이션 된 항목이 아닌 기본 프로젝트 항목으로 채워지는 이유는 무엇입니까? Action 메서드에서 할당 된 것)?

답변

2

"DropDownListFor"의 첫 번째 매개 변수는 바인딩 용이며 선택한 값을 재정의합니다. "프로젝트"개체를 사용하고 있지만 대신 프로젝트의 "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()"기능을 재정 의하여 "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)) 

이렇게하면 동일한 html이 생성됩니다.

+0

ID를 선택하면 선택한 프로젝트의 POST에 ModelBinding이 표시되지 않습니다. 그것도 좋지 않습니다. –

+0

내 업데이트를 검토하십시오. "Project"클래스의 "ToString()"함수를 재정 의하여 접근 방식을 만드는 방법이 있습니다. –

+0

제안서를 통해 항목을 미리 선택할 수있었습니다. 또 다른 것은 ModelBinding에 관한 것입니다. TypeConverter를 사용해야 할 것 같습니다. 어쨌든 고마워! –

1

당신이 사용하고있는 데이터베이스 asscess의 방법을 모르겠다면 Model.Instance.Project가 컨트롤러의 부분을 벗어나면 null이 될 것이라고 생각합니다. 을 ViewData (또는 ViewBag) throgh 선택한 값을 전달하십시오 :

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

희망을.

+0

한 번에 한 줄씩 Action 메서드를 단계별로 실행할 수 있으며 ** Model.Instance.Project **가 null이 아닌지 확인할 수 있습니다. –

관련 문제