2012-06-20 2 views
0

MVC 등에서 매우 익숙합니다. Contact의 모습MVC3을 사용하여 뷰의 List 속성을 설정하십시오.

public class SomeExampleModel 
{ 
    public int Id { get; private set; } 
    public string Name { get; private set;} 
    public string Street { get; private set; } 
    public IList<Contact> Contacts { get; private set; } 
    ... 
} 

: 나는 수업이 같은 모습이

public class Contact 
{ 
    public int Id { get; private set; } 
    public int SomeExampleModelId { get; private set; } 
    public ContactType Type { get; private set; } 
    public string ContactValue { get; private set; } 
... 
} 

이제 문제는, 나는 새로운 SomeExampleModel을 추가하는 포스트 Create 행동과 Create.cshtml보기가 내 데이터 베이스. 그것은 모든 기본 속성에 잘 작동하지만 연락처 속성 (데이터베이스의 별도 테이블)에는 아무 것도 없습니다.

내보기의 양식을 사용하여 연락처 (현재는 단일, 미래는 복수)를 어떻게 추가 할 수 있습니까?

편집 : 내가 명확하지 않으면 죄송합니다. 문제는 데이터를 데이터베이스에 올바르게 저장하지 못하는 것입니다. 난 이미 그것을 테스트하고 SomeExampleContext 함께 데이터베이스에 SomeExampleModel 레코드를 수동으로 삽입하면 잘 작동합니다. 초기는 SomeExampleModel의 생성 않는 한, 그리고 - 내가 해달라고 무엇을 알고 는 사용자가 기록

+0

드릴 것입니다 무엇을

enter image description here

스크린 샷과 같은 모습입니다? 어떤 백엔드를 프로젝트에서 사용합니까 (EF with MsSQL)? 어떤 ORM? –

+0

ContactType은 현재 전자 메일 (0) 또는 전화 (1) 일 수있는 열거 형입니다. EF 4.3.1은 백 엔드에 사용됩니다 (그리고 Enum이 작동하기 위해서는 몇 가지 속임수를 사용합니다). – Killnine

+0

EF4.1 이상을 사용하는 경우, 트릭이 필요하지 않습니다. 공식 사용법을 확인하십시오. http://blogs.msdn.com/b/efdesign/archive/2011/06/29/enumeration-support-in-entity-framework.aspx –

답변

1

여기에 EditorTemplate을 사용하는 한 가지 방법이 있습니다. 나는 당신의 모델 클래스를 약간 변경 한 (이 작동합니다. 그러나, 이것은 당신이 개념을 이해만을위한 것입니다 점에 유의 당신이에 따라 확장 할 수 있습니다)를 기록합니다

public class SomeExampleModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set;} 
    public string Street { get; set; } 
    public IList<Contact> Contacts { get; set; }  
} 

public class Contact 
{ 
    public int Id { get; set; } 
    public int SomeExampleModelId { get; set; } 
    public ContactType Type { get; set; } 
    public string ContactText { get { return Type.ToString(); } } 
    public string ContactValue { get; set; } 
} 

public enum ContactType 
{ 
    email, 
    Phone, 
    mobile, 
    fax 
} 

모델이 I 열거 형 텍스트를 반환하는 (ContactText)

연락처 (이름이 Contact.cshtml이고 템플릿 이름이 클래스 이름과 일치해야 함)에 대한 편집기 템플릿을 만듭니다. 아래에서 편집기 템플릿을 배치 할 위치의 스크린 샷을 찾으십시오.여기

enter image description here

여기에 (내 경우에는 ExampleCreateView.cshtml)이 '만들기'보기에 대한 코드

@model Test1.Models.SomeExampleModel 

@{ 
    ViewBag.Title = "ExampleCreateView"; 
} 

<h2>ExampleCreateView</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>SomeExampleModel</legend> 
     @Html.HiddenFor(model=>model.Id) 
     <table> 
      <tr> 
       <td>@Html.LabelFor(model=>model.Name)</td> 
       <td>@Html.EditorFor(model=>model.Name)</td> 
      </tr> 
      <tr> 
       <td>@Html.LabelFor(model=>model.Street)</td> 
       <td>@Html.EditorFor(model=>model.Street)</td> 
      </tr> 
      <tr> 
       <td>@Html.LabelFor(model=>model.Contacts)</td> 
       <td>@Html.EditorFor(model=>model.Contacts)</td> 
      </tr> 
     </table> 
     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

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

방법에 메모를 확인이 Contact.cshtml

@model Test1.Models.Contact 
<table> 
@Html.HiddenFor(a=>a.Type) 
<tr> 
<td>@Html.Label(Model.ContactText)</td> 
<td>@Html.TextBoxFor(a => a.ContactValue)</td> 
</tr> 
</table> 

코드입니다 Contacts 속성에 @Html.EditorFor을 사용했습니다. 여기

는 GET, POST 액션이

public ActionResult ExampleCreateView() 
    { 
     SomeExampleModel model = new SomeExampleModel(); 
     Contact contactEmail = new Contact(); 
     contactEmail.Type = ContactType.email; 

     Contact contactFax = new Contact(); 
     contactFax.Type = ContactType.fax; 

     Contact contactPhone = new Contact(); 
     contactPhone.Type = ContactType.Phone; 

     Contact contactMobile = new Contact(); 
     contactMobile.Type = ContactType.mobile; 

     List<Contact> contacts = new List<Contact>(); 

     contacts.Add(contactEmail); 
     contacts.Add(contactFax); 
     contacts.Add(contactPhone); 
     contacts.Add(contactMobile); 

     model.Contacts = contacts; 

     return View(model); 
    } 

    [HttpPost] 
    public ActionResult ExampleCreateView(SomeExampleModel model) 
    { 
     //Your operations 
     return View(model); 
    } 

응용 프로그램을 실행처럼 보이게하는 방법입니다. 이보기 당신이 또한 ContactType 선언이 마십시오 POST 액션

enter image description here

+0

절대적으로 훌륭한 예입니다. 그러나 연락처 양식을 내보기에 표시하는 데 문제가 있습니다. 내 SomeExampleModel을 별도의 'Domain'프로젝트 (Contact 클래스와 함께)로 가져 왔기 때문일 수도 있다고 생각합니다. 그게 혼란스러운 MVC와 그것이 기대하는 관습인가요? – Killnine

+0

@Killnine 'Domain'project는 무엇을 의미합니까? 별도의 네임 스페이스를 의미합니까? 그것은 문제가되지 않습니다. SomeExampleModel을 사용하여 'name', 'street'에 이미이 작업을 수행 한 경우 Contact에서도 잘 작동합니다. 각 모델 (namespace.modelclass 형식)의 정규화 된 이름을 제공하기 만하면됩니다. 내 대답에서 단계를 수행하십시오 (또한 철자 실수없이 디렉토리 구조가 정확해야하며,보기 -> 공유 -> EditorTemplates -> Contact.cshtml). 또한 Contact.cshtml이 올바른 모델을 맨 위에서 지정했는지 확인하십시오. –

+0

예, 다른 네임 스페이스입니다. 아프다면 자세히 보아라. 그래도이게 내가 찾고 있던거야. 매우 철저하고 상세한 설명에 감사드립니다. – Killnine

0

내가 두 개의 별도의 작업을하는 것입니다 할 것입니다 방법에 연락처를 추가 할 수 있도록 내보기 초안을 작성하는 방법입니다 해당 모델에 Contact을 추가하기위한 별도 조치.

이렇게하면 SomeExampleModel보기에는 이름과 거리 만 표시되고 저장하면 SomeExampleModel의 읽기 전용 버전이 표시됩니다. 읽기 전용 버전 SomeExampleModel은 이름 및 거리 아래의 테이블에있는 모든 관련 연락처를 편집 및 삭제 링크와 함께 나열하고

등의 테이블 아래에 '새 연락처 추가'링크를 표시합니다.

<table> 
@foreach (var contact in Model.Contacts) 
{ 
    <tr> 
     <td>@contact.ContactType</td> 
     <td>@contact.ContactValue</td> 
     <td>@Html.Action("Edit", "Edit", "Contact", new { id = contact.Id }</td> 
     <td>@Html.Action("Delete", "Delete", "Contact", { id = contact.Id }</td> 
    </tr> 
} 
</table> 
@Html.Action("Add new contact", "Add", "Contact" new { id = Model.Id } 

초기에는 아무 연락처도 나열되지 않았으며 나중에는 여러 개의 연락처가 있습니다.

관련 문제