2011-01-03 4 views
5

참고 모델에 대한 기능을 만들 : 나는 MVC3 + 면도기, EF4, CF-CTP5ASP.NET MVC 3보기 만들기에 ICollection은 재산권과

  1. 어떻게 사용하고 보기에서 클라이언트 당 조직에 여러 주소 클래스를 동적으로 추가 할 수 있으며 게시시 모델에 강력하게 바인딩 할 수 있습니다.

  2. (ModelState.IsValid == false) 3 개의 주소를 입력하고 유효하지 않은 모델을 게시하면 숫자 주소와 해당 값을 다시 채우도록 모델에서 뷰 구문 분석 값을 가질 수 있습니까? 가치? 여기

내 모델입니다 :

public class Organization 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Address> Addresses { get; set; } 
    public virtual ICollection<PhoneNumber> PhoneNumbers { get; set; } 
    ... 
} 

public class Address 
{ 
    public int Id { get; set; } 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string PostalCode { get; set; } 
    public string Country { get; set; } 
    public int Type { get; set; } 
} 

난 당신이 조직의 생성 작용 (/기구/만들기)을 가질 수있는 방법을 알아 내기 위해 노력하고 따라서처럼 만들 처리 (있도록 주소 이 단지 귀하의 요구 사항을 달성 할 수있는 방법 중 하나입니다

[HttpPost] 
public ActionResult Create(Organization organization) 
{ 
    if (ModelState.IsValid) 
    { 
     _db.Organizations.Add(organization); 
     _db.SaveChanges(); 
     return RedirectToAction("Details", organization.Id); 
    } 

    return View(organization); 

} 

답변

1

귀하의 질문은 매우 vaste입니다 :) 내가이 확신 : 및 전화 번호는 제출 된 모델의 일부)입니다 내 것보다 낫다.

내가 두 번째 질문에서 시작하기 위하여려고하고있다

: 당신이보기 구문 분석 모델에 값이 어떻게

경우 (ModelState.IsValid == false)를 같은 당신은 3을 입력하면 주소가 인 경우 잘못된 숫자가 표시되면 숫자 주소와 적절한 값으로 다시 채 웁니다.

귀하의 요청을 정확하게 이해하면 매우 간단 해 보입니다. 대답은 입니다. Model 클래스 콘텐츠를 렌더링하는 코드는이며 Create 작업에서 수행하는 것과 똑같은 잘못된 모델을 클라이언트에 반환합니다.

양식 (및 필드)이 ValidationSummary/ValidationMessage html 헬퍼로 장식 된 경우 유효성 검사 메시지도 표시됩니다.

  1. 어떻게 뷰는 클라이언트에서 조직 동적으로 당 여러 개의 주소 클래스를 추가 할 수있는 능력을 가질 수 있도록 할 수 있으며, 강하게 게시물에 모델을 결합?

조직 속성을 보여주는 주보기를 가질 수 있고 관련 주소를 보여주는 다른보기를 가질 수 있습니다. 여기서 새 주소 개체를 추가하기위한 대화 상자를 여는 하이퍼 링크 나 단추를 배치 한 다음 완료되면 주소 목록을 새로 고칠 수 있습니다. 같은 방법으로 버튼을 목록에서 아이콘으로 편집하고 삭제할 수 있습니다.

주소 목록은 클라이언트 측에서 완전히 처리되는 마크 업 조각으로, 서버 측 Model 클래스에 올바르게 바인딩되기 위해서는 입력 속성에 대한 간단한 명명 규칙을 따라야합니다.

는 기본 모델 바인더 클래스 바인딩이 제대로 양식은 다음

<form action="..." id="..." method="post"> 
    <input type="hidden" name="Id" value="2"> 
    <input type="hidden" name="Name" value="Acme Corporation"> 

    <!-- markup for each address --> 
    <input type="hidden" name="Addresses[0].Id" value="1"> 
    <input type="hidden" name="Addresses[0].Line1" value="Line 1"> 
    <input type="hidden" name="Addresses[0].Line2" value="Line 2"> 
    ... and so on... 
</form> 
과 같아야

@using (Html.BeginForm()) { 
    @Html.HiddenFor(o => o.Id) 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>My Organization</legend> 
     <div class="editor-label">@Html.LabelFor(model => model.Name)</div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.Name) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 
     <br /> 
     <div id="container"> 
      <div>Address List</div> 
      @foreach (Address a in Model.Addresses) { 
       Html.EditorFor(a); 
      } 
     </div> 
     <div style="text-align:right;margin-top:14px;"> 
      <input type="submit" id="btnSubmit" value="Save" /> 
     </div> 
    </fieldset> 
} 

가 자동으로 폼의 결과 코드를 바인딩하기 위해 당신의 Organization 클래스의 다음 코드를 사용하여 만들려면

의 속성은 Addresses[index].PropertyName입니다. 클라이언트에 새 주소를 추가하면 그다지 중요하지 않습니다. 코드에서이 규칙을 존중하면 기본 모델 바인더에서 작업을 수행 할 수 있습니다.

희망이

0

내가 제대로 질문을 이해 확실하지만 난 당신이 뷰 모델을 찾고 생각하는 질문 1에 대한 아니에요 도움이됩니다. 이처럼 아마 ..

OrganizationViewModel.cs

public class OrganizationViewModel 
{ 
    public OrganizationViewModel(Organization org, IList<Address> addresses) 
    { 
     this.Organization = org; 
     this.Addresses = addresses 
    } 
    public Organization Organization {get;set;} 
    public IList<Address> Addresses {get;set;} 
} 

OrganizationController.cs

public class OrganizationController : Controller 
{ 
    private readonly IOrganizationService _organizationService: //or whatever method you use 
    public OrganizationController(IOrganizationService orgService) 
    { 
     this._organizationService = orgService; 
    } 

    public ActionResult Item(int id) 
    { 
     var org = _organizationService.GetOrganizationById(id); 
     var addresses = _organizationService.GetOrgAddressesByOrgId(id); 
     return View(new OrganizationViewModel(program, addresses)); 
    } 
} 

Item.cshtml

@model OrganizationViewModel 
<h1>@Model.Organization.Name</h1> 
<ul> 
@foreach(var a in Model.Addresses) 
{ 
<li>@a.Line1</li> 
<li>@a.Line2</li>} 
</ul> 

내가 어쩌면 당신이 표시해야 시도하고 2 번에 대답하기 전에 질문 1을 올바르게 이해하고 있는지 여부. 이것이 도움이되기를 바랍니다.

0

저는 LINQ to SQL을 사용하여이 작업을 관리했습니다. 이제 Entity Framework를 대신 사용하려고 시도하지만 실제로 모든 것을 더 복잡하게 만듭니다. 그래서 당신을위한 해결책이 없지만 L2S 솔루션이 도움이 될 수 있습니까?

사용 모델은 내가보기에이 작업을 수행 할 수있는 내 데이터베이스에서 생성 : 내가보기 모델 클래스했다

@for (int i = 0; i < Model.Contact.EmailAddresses.Count; ++i) 
{ 
    <li> 
     @Html.TextBoxFor(x => x.Contact.EmailAddresses[i].EmailAddress) 
     @Html.HiddenFor(x => x.Contact.EmailAddresses[i].EmailAddressID) 
    </li> 
} 

: 이것은 잘 작동하고 내 컨트롤러 액션에 내가 가진

class ContactViewModel 
{ 
    Contact contact { get; set; } 
} 

을 내 Contact.ContactEmailAddresses 목록은 내가 예상했던대로 채워집니다.

그러나 EF를 사용하면 더 이상 데이터베이스에서 생성 된 EmailAddresses 속성에 [i]를 사용할 수 없습니다. 내가 생각해 낸 최선은 다음과 같습니다.

@Html.TextBox("Contact.EmailAddresses[" + i + "].EmailAddress", Model.Contact.EmailAddresses.ElementAt(i).EmailAddress)