2011-02-16 4 views
1

EF에서 액세스하는 데이터베이스 "컨설턴트"가있는 Asp.Net MVC 3 응용 프로그램이 있습니다. 이제 db의 Consultant 테이블에는 CV 유형 정보 (작업 경험 등)에 대한 여러 테이블과 일대 다 관계가 있습니다. 따라서 사용자는 자신의 이름 등을 한 번 기입 할 수 있어야하지만 여러 가지 "업무 경험"을 추가 할 수 있어야합니다.MVC 3 응용 프로그램에서 모델의 객체 속성보기 생성?

그러나 이러한 외래 키 테이블은 모델의 복잡한 개체이며 Create View를 만들 때 간단한 속성 만 편집기 필드로 가져옵니다. 복잡한 객체를 채울 수 있도록보기 또는 뷰를 설계하려면 어떻게해야합니까? 단순한 속성이 간단한 필드 인 뷰를 내 마음 속에 그린 다음, "직장 경험 추가"를 클릭하고 필요한만큼 많은 것을 추가 할 수있는 일종의 컨트롤을 그림으로 그립니다. 그러나 나는 그것을 어떻게 할 것이고 여전히 모델 바인딩을 활용할 것인가? 사실, 나는 그것에 대해 어떻게 가야할지 모릅니다. (BTW, 프로그램 및 언어는 일반적으로 소프트웨어 경험, 자연 언어 능력, 프로그래밍 언어가 아닌 다른 언어와의 관계에 대해 궁금해 할 때 사용할 수 있습니다.)

대단히 감사합니다.

여기에 기본적으로 추가보기 명령에 의해 생성 된 생성 뷰의 :

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>Consultant</legend> 

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

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

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

     <div class="editor-label"> 
      @Html.LabelFor(model => model.Description) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Description) 
      @Html.ValidationMessageFor(model => model.Description) 
     </div> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

가 그리고 여기 EF 데이터베이스 다이어그램입니다 :

Consultants EF diagram

업데이트 : 제안에 따르면

, Steven Sanderson의 블로그 솔루션을 사용해 보았지만 올바르게 작동하지는 않습니다.

<script type="text/javascript"> 
    var url = '@Url.Action("BlankEditorRow", "Consultant")'; 
    $(document).ready(function() { 
     $("#addItem").click(function() { 
      $.ajax({ 

       url: url, 
       cache: false, 
       success: function (html) { 
        alert(html); 
       $("#editorRows").append(html); } 
      }); 
      return false; 
     }); 
    }); 
</script> 

부분보기 : 컨트롤러의

@model Consultants.Models.Program 
@using Consultants.Helpers 

<div class="editorRow"> 
@*@using (Html.BeginCollectionItem("programs")) 
{*@ 
    @Html.TextBoxFor(model => model.Name)  
@*}*@ 
</div> 

및 동작 방법 :

public ActionResult Create() 
    { 
     Consultant consultant = new Consultant(); 

     return View(consultant); 
    } 


    public ActionResult BlankEditorRow() 
    { 
     return PartialView("ProgramEditorRow", new Program()); 
    } 

<div id="editorRows"> 
     @foreach (var item in Model.Programs) 
     { 
      Html.RenderPartial("ProgramEditorRow", item); 
     } 
    </div> 
<input type="button" value="Add program" id="addItem" /> 

는 I는 자바 스크립트가 추가 I의 주요 관점이 추가

나는 Html.BeginC ollectionItem 부분 뷰에서, 내가 그 일을 할 수 없기 때문에. 스티븐 샌더슨이 말한 숨겨진 필드 만 제공합니다. 실제 텍스트 상자는 아닙니다. 그래서 나는 그 부분에 대해 의견을 말하려하고 텍스트 상자를 가지고있었습니다. 글쎄, 그게 날 텍스트 상자를 가져옵니다,하지만 그 방법에 정보를 얻을 수 없습니다. 컨설턴트 개체를 반환 매개 변수로 사용하지만 프로그램 속성에 프로그램이 없습니다. 아마도 이것은 BeginCollectionItem 도우미가 작동하도록 할 수 없다는 사실과 관련이 있습니다. 그러나 어쨌든이를 수행하는 방법을 이해하지 못하거나, 프로그램에서 뷰에 추가 된 프로그램을 얻는 방법을 알지 못합니다. 간단한 개체를 사용하여 post 메서드에 _repository.AddToConsultants (consultant)와 같은 새 개체를 추가하고 EF에 저장할 때 ID를 얻습니다. 그러나 어떻게 프로그램 객체를 가지고 동일한 작업을 수행하고 EF를 통해 데이터베이스에 저장합니까?

답변

1

Phil Haack은 목록에 바인딩 모델을 만드는 방법을 설명하는 훌륭한 블로그 게시물을 작성했습니다. MVC2에만 한정되어 있지만, 버전 3이 개선되었는지 확실하지 않습니다.

Model Binding To A List.

사용자가 임의의 수의 항목을 추가 할 수있는 시나리오에서는 JavaScript를 사용하여 새로운 입력 필드를 만들고 싶을 것입니다. Steven Sanderson은이를 달성하는 방법을 보여줍니다 :

Editing a variable length list, ASP.NET MVC 2-style.

이 리소스는 모든 방법으로 사용자에게 제공됩니다.

+0

이것은 흥미로운 리드처럼 보입니다. 나는 그것을 조사 할 것이다, 고마워! – Anders

+0

좋아, 좋은 링크 였지만, 불행히도 제대로 작동하지 못했습니다. 내 업데이 트를 참조하십시오 ... – Anders

+0

좋아, 적어도 거기 절반 방법이있어, 그래서 여기에 정착하고 새로운 질문을 시작합니다. 감사. – Anders

0

사용자 정의 개체 템플릿을 작성하는 방법은 following blog post을 참조하십시오. 또한보기에서 EF 모델을 사용하지 마십시오. 주어진 뷰의 필요에 맞게 특별히 조정 된 클래스 인 뷰 모델을 디자인하고 EF 모델과 뷰로 전달되어야하는 뷰 모델간에 컨트롤러 맵핑을합니다. AutoMapper은이 매핑을 단순화 할 수있는 좋은 도구입니다.

+1

제안 해 주셔서 감사합니다. 대부분의 경우 ViewModels를 사용해야하지만 새 컨설턴트를 만들려면 기본적으로 동일한 속성을 포함하는 완전히 새로운 ViewModel을 만들어서 무엇을 얻을 수 있습니까? 또는 ViewModel이 어떻게 보일 것임을 의미합니까? – Anders

관련 문제