문제

최근에 나는 HTML 헬퍼 드롭 다운 목록에 대한 질문을 게시하고 작동하게했습니다 (여기). 그러나 이제 나는 ModelView 패턴으로 전환하는 것이 훨씬 더 똑똑하기로 결정했기 때문에 내보기 등에 강력하게 입력 한 메소드에 액세스 할 수 있습니다.

VacatureFormViewModel :

public class VacaturesFormViewModel
{
    public Vacatures Vacature { get; private set; }
    public SelectList EducationLevels { get; private set; }
    public SelectList Branches { get; private set; }
    public SelectList CareerLevels { get; private set; }

    Repository repository;

    // Constructor
    public VacaturesFormViewModel(Vacatures vacature)
    {
        this.Vacature = vacature;
        this.repository = new Repository();
        this.EducationLevels = new SelectList(repository.GetAllEducationLevels(),"ID","Name",vacature.EducationLevels);
        this.Branches = new SelectList(repository.GetAllBranches(),"ID","Name",vacature.Branches);
        this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), "ID", "Name", vacature.CareerLevels);

    }
}

BanenController :

//
    // GET: /Banen/Create

    public ActionResult Create()
    {
        Vacatures vacature = new Vacatures();
        return View(new VacaturesFormViewModel(vacature));
    }

    //
    // POST: /Banen/Create

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Vacatures vacatureToAdd)
    {
        if (ModelState.IsValid)
        {
            try
            {
                // TODO: Add insert logic here
                repository.AddToVacatures(vacatureToAdd);
                repository.SaveChanges();

                // Return to listing page if succesful
                return RedirectToAction("Index");
            }
            catch (Exception e)
            {
                return View();
            }
        }
    }

그리고 나의 create.aspx보기 (일부) :

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="Title">Title:</label>
            <%= Html.TextBox("Title", Model.Vacature.Title) %>
            <%= Html.ValidationMessage("Title", "*") %>
        </p>
        <p>
            <label for="Content">Content:</label>
            <%= Html.TextArea("Content", Model.Vacature.Content) %>
            <%= Html.ValidationMessage("Content", "*") %>
        </p>
        <p>
            <label for="EducationLevels">EducationLevels:</label>
            <%= Html.DropDownList("EducationLevels", Model.EducationLevels)%>
            <%= Html.ValidationMessage("EducationLevels", "*") %>
        </p>
        <p>
            <label for="CareerLevels">CareerLevels:</label>
            <%= Html.DropDownList("CareerLevels", Model.CareerLevels)%>
            <%= Html.ValidationMessage("CareerLevels", "*")%>
        </p>
        <p>
            <label for="Branches">Branches:</label>
            <%= Html.DropDownList("Branches", Model.Branches)%>
            <%= Html.ValidationMessage("Branches", "*")%>
        </p>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
<% } %>

안내를 위해 나는 사용했다 Nerddinner Scottgu와 저는 여기에서 다양한 주제를 읽었습니다.

내 질문은 MVC ASP가 현재 Careerlevel, EducationLevel 및 Branche (DropdownLists)를 자동으로 설정할 수 있는지 여부입니다. 현재 내가 원하는 ID 문자열을 반환하고 있습니다. SelectList의 생성을 변경할 때 :

this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), vacature.CareerLevels);

따라서 "ID"와 "이름"이 없으면 저장하지 않으며 (객체 자체가 아닌 포스트 메소드의 문자열로 여전히 리턴 된 것 같아요) 옆에는 다음과 같이 표시됩니다. Vacuation. EducationLevels 등 이름은 아니지만 개체 자체가 나열됩니다.

마지막 질문요컨대, 내 질문은이 접근법을 사용하여 지사, EducationalLevel 및 Careerlevel을 설정할 수 있는지 여부입니다. 그래서 자동으로하지 않습니까?

어떤 경우에는 여전히 다음과 같은 것을 사용해야합니다.

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection form)
    {
        Vacatures vacatureToAdd = new Vacatures();

        // Retrieve the education level by its ID
        if (!form["EducationLevels"].Equals(""))
        {
            Guid educationID = new Guid(form["EducationLevels"]);
            vacatureToAdd.EducationLevels = repository.GetEducationLevelByID(educationID);
        }

내 컨트롤러에서? 또는 다른 매끄러운 옵션이 있습니까?

도움이 되었습니까?

해결책

편집하기 Guid :

드롭 다운 목록에서는 약간 다른 접근법을 사용합니다. ViewModel을 작동시킬 수 있지만 이런 식으로 더 쉽습니다.

public class VacaturesFormViewModel
{

    public IEnumerable<SelectListItem>EducationLevels{ get; set; }
    public Guid EducationLevelID{ get; set; }

}

EducationLevelid는 드롭 다운의 선택한 ID를 갖습니다. 이것은보기입니다 :

<%= Html.DropDownList("EducationLevelID", Model.EducationLevels)%>

제어 장치

  IEnumerable<SelectListItem> educationLevelList =
                            from level in GetLevelList()
                            select new SelectListItem
                            {
                                Text = level .Name,
                                Value = level.Uid.ToString()
                            };
  model.EducationLevels = educationLevelList ;

다른 팁

확실하지 않지만 모델 바인더를 만들어야한다고 생각합니다. (데이비드 헤이든 간단한 모델 바인더를 썼습니다)

당신은 묶을 수 있습니다 Education 자동으로 매개 변수 :

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Guid? educationID, FormCollection form)
{
    Vacatures vacatureToAdd = new Vacatures();

    if (educationID != null)
    {
        vacatureToAdd.EducationLevels = 
            repository.GetEducationLevelByID(educationID.Value);
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top