>

보기의 섹션을 가져 와서 여러 부분보기로 나누고 싶습니다. 부분보기에 관심이있는 모델의 일부만 전달하고 싶습니다. 일반적으로 기본보기로 전달되는 모델의 속성으로 부분적입니다.

하지만 문제는 이것이 HTML 바인더가 모델 바인더가 다른 객체의 속성이라는 것을 부분적으로 인식하지 못하기 때문에 모델 바인더를 올바르게 다시 넣을 수있는 방식으로 렌더링하지 못하게하는 것입니다.

이 방법을 좋아하는 것은 경험이 부족한 프로그래머가 모든 코드가 이미 구조화되어 있기 때문에 코드가 너무 체계적이며 어려워서 경험이 부족한 프로그래머가 내 코드 전체에 똥을 넣을 수 있습니다. 그리고 지금까지 이것은 부분적으로 폼 입력을 취할 필요가 없거나 아약스 호출로 처리 되었기 때문에 나에게 문제가되지 않았습니다. 이번에는 일반 DefaultBinder를 사용하고 전체 모델을 모든 부분 뷰로 보내지 않고도이 작업을 수행 할 수있는 방법이 있는지 궁금합니다.

예 :

메인 뷰에는 다음 코드 줄이 있습니다 :

@{ Html.RenderPartial("_Registrants", Model.Registrants); }

등록자는 부분적으로 다음과 같이 보입니다 :

@model Models.Order.RegistrantsModel
// stuff...
// important part:
@for(int i = 0; i < Model.Count(); i++)
{
    @Html.HiddenFor(o => o[i].Enabled)
    <ul class="frmRow@(Model[i].Enabled ? "" : " disabled")">
        <li>
            <span class="title">First Name</span>
            @Html.TextBoxFor(o => o[i].FirstName, new { @placeholder = "enter first name" })
            @Html.ValidationMessageFor(o => o[i].FirstName)
        </li>
        <li>
            <span class="title">Last Name</span>
            @Html.TextBoxFor(o => o[i].LastName, new { @placeholder = "enter last name" })
            @Html.ValidationMessageFor(o => o[i].LastName)
        </li>
        <li>
            <span class="title">Email Address</span>
            @Html.TextBoxFor(o => o.First().Email, new { @placeholder = "enter email address" })
            @Html.ValidationMessageFor(o => o[i].Email)
        </li>
    </ul>
}

주 모델은 다음과 같습니다 :

public class CourseRegistrationModel
{
    public CourseRegistrationModel() { }
    public CourseRegistrationModel(RegistrationItemModel itemModel, PaymentModel paymentModel)
    {
        Item = itemModel;
        Payor = new PayorModel();
        Registrants = new RegistrantsModel();
        Shipping = new ShippingModel();
        Payment = paymentModel;
    }
    public RegistrationItemModel Item { get; set; }
    public PayorModel Payor { get; set; }
    public RegistrantsModel Registrants { get; set; }
    public ShippingModel Shipping { get; set; }
    public PaymentModel Payment { get; set; }
}

RegistrantsModel 및 RegistrantModel은 다음과 같습니다.

public class RegistrantsModel : IEnumerable<RegistrantModel>
{
    public RegistrantsModel()
    {
        _registrants = new List<RegistrantModel>();
        for(int i = 0; i < 5; i++)
            _registrants.Add(new RegistrantModel());
        _registrants.First().Enabled = true; // Show one registrant on form by default
    }
    List<RegistrantModel> _registrants { get; set; }
    public decimal PricePerPerson { get; set; }
    public int NoOfRegistrants { get; set; }
    public RegistrantModel this[int i]
    {
        get { return _registrants[i]; }
    }
    public IEnumerator<RegistrantModel> GetEnumerator() { return _registrants.GetEnumerator(); }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _registrants.GetEnumerator(); }
}
public class RegistrantModel: IEnabled
{
    [RequiredIfEnabled]
    public string FirstName { get; set; }
    [RequiredIfEnabled]
    public string LastName { get; set; }
    [RequiredIfEnabled]
    [EmailAddress(ErrorMessage = "Please Enter a Valid Email Address")]
    public string Email { get; set; }
    public bool Enabled { get; set; }
}

  • 답변 # 1

    부분이 name 를 사용하여 양식 컨트롤을 생성 중입니다.   RegistrantModel 콜렉션과 관련된 속성  예 :

    <input name="[0].FirstName" ... />
    
    
    매개 변수 IList<RegistrantModel> 를 사용하여 POST 메소드에 바인드하는

    . 당신의 CourseRegistrationModel 에 바인딩하기 위해 , 입력해야합니다

    <input name="Registrants[0].FirstName" ... />
    
    

    name 에 올바른 접두사를 추가하는 두 가지 옵션이 있습니다  속성.

    하나는 접두사를 AdditionalViewData 로 전달하여 추가하는 것입니다.   RenderPartial() 에서  방법

    @{ Html.RenderPartial("_Registrants", Model.Registrants,
        new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "Registrants" }}); }
    
    

    또한 뷰에서 코드를 단순화하는 데 사용할 수있는 확장 메서드에 대해 부분 뷰로 전달되는 중첩 된 복합 객체에서 값을 가져 오는 것을 참조하십시오

    선호하는 방법은 EditorTemplate 를 사용하는 것입니다   RegistrantModel 유형 . 부분 이름을 클래스 이름과 동일하게 지정해야합니다 (귀하의 경우 RegistrantModel.cshtml )를 /Views/Shared/EditorTemplates 에서 찾으십시오.  폴더 (또는 /Views/YourControllerName/EditorTemplates )  컨트롤러마다 다른 템플릿을 사용하려는 경우). 그런 다음 템플릿은 모델의 단일 인스턴스를 기반으로합니다

    @model RegistrantModel
    @Html.LabelFor(m => m.FirstName)
    @Html.TextBoxFor(m => m.FirstName, new { @placeholder = "enter first name" })
    @Html.ValidationMessageFor(m => m.FirstName)
    ....
    
    

    및 기본보기에서 사용

    @Html.EditorFor(m => m.Registrants)
    
    

    와이즈 비즈  이 메소드에는 단일 EditorFor() 를 모두 허용하는 과부하가 있습니다.  그리고 T 컬렉션의 경우 메소드는 컬렉션의 각 항목에 대해 올바른 HTML을 생성합니다.

    IEnumerable<T>

  • 이전 고유 문자를 찾기 위해 목록을 반복
  • 다음 ruby - 울타리 - 데이터베이스에 숨겨진 필드 태그 저장