2014-07-27 2 views
1

jQuery 템플릿을 사용하여 양식에 동적으로 입력을 추가하려고합니다.ASP.NET MVC에서 jQuery 템플릿을 생성하는 방법은 무엇입니까?

은 내 뷰 모델은 렌더링 양식이 내가 동적으로 생성됩니다 입력을 위해 사용하는 내 모델입니다

public class FormViewModel 
{ 
    public int Id { get; set; } 

    [Required] 
    [StringLength(25, ErrorMessage = "Max firstname length is 25 symbols.")] 
    [DisplayName("First name")] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(25, ErrorMessage = "Max lastname length is 25 symbols.")] 
    [DisplayName("Last name")] 
    public string LastName { get; set; } 

    [Required] 
    [Email(ErrorMessage = "Provide correct email address, please.")] 
    [DisplayName("Email")] 
    public string Email { get; set; } 

    [Range(16, 150, ErrorMessage = "Age should be between 16 and 150.")] 
    [DisplayName("Age")] 
    public int? Age { get; set; } 

    public IList<DiscountCode> Discounts { get; set; } 
} 

아래에 나열됩니다.

public class DiscountCode 
    { 
     [Required] 
     [DisplayName("Code name")] 
     [StringLength(10, ErrorMessage = "Max name length is 10 symbols.")] 
     public string Code { get; set; } 

     [Required] 
     [DisplayName("Code discount")] 
     [Integer(ErrorMessage = "The field Percent should be a positive non-decimal number")] 
     [Range(1,60, ErrorMessage = "The field Percent should be between 1 and 60.")] 
     public int Percent { get; set; } 
    } 

는 나는이 코드

var data = { index: lastIndex }; 
var html = $.templates("#discountRow").render(data); 
$(html).appendTo($discountsContainer); 

이 템플릿을 사용 DiscountCode 입력

@using DynamicForm.Models 
@model FormViewModel 
@if (Model != null && Model.Discounts != null) 
{ 
    for (int i = 0; i < Model.Discounts.Count; i++) 
    { 
     <div class="row"> 
      <input type="hidden" name="Discounts.Index" value="@i" /> 
      <div class="col-md-4 form-group"> 
       <div class="input-group"> 
        @Html.TextBoxFor(m => m.Discounts[i].Code, new { @class = "form-control " }) 
        @Html.ValidationMessageFor(m => m.Discounts[i].Code, string.Empty, new { @class = "help-block" }) 
       </div> 
      </div> 
      <div class="col-md-6 form-group"> 
       <div class="input-group"> 
        @Html.LabelFor(m => m.Discounts[i].Percent, new { @class = "control-label" }) 
        @Html.TextBoxFor(m => m.Discounts[i].Percent, new { @class = "form-control " }) 
        @Html.ValidationMessageFor(m => m.Discounts[i].Percent, string.Empty, new { @class = "help-block" }) 
       </div> 
      </div> 
      <div class="col-md-2 form-group"> 
       <div class="input-group"> 
        <button type="button" class="btn btn-primary removeDiscountRow">Remove</button> 
       </div> 
      </div> 
     </div> 
    } 
} 

렌더링 및 할인 입력을 추가하기 위해이 부분보기가

<script id="discountRow" type="text/x-jsrender"> 
    <div class="row"> 
     <input type="hidden" name="Discounts.Index" value="{{: index}}"> 
     <div class="col-md-4 form-group"> 
      <div class="input-group"> 
       <label class="control-label" for="Discounts_{{: index}}__Code">Code name</label> 
       <input class="form-control " data-val="true" data-val-required="Code is required" data-val-length="Max name length is 10 symbols." data-val-length-max="10" 
         id="Discounts_{{: index}}__Code" name="Discounts[{{: index}}].Code" type="text" value=""> 
       <span class="field-validation-valid help-block" data-valmsg-for="Discounts[{{: index}}].Code" data-valmsg-replace="true"></span> 
      </div> 
     </div> 
     <div class="col-md-6 form-group"> 
      <div class="input-group"> 
       <label class="control-label" for="Discounts_{{: index}}__Percent">Code discount</label> 
       <input class="form-control " data-val="true" data-val-required="Percent is required" data-val-number="The field Code discount must be a number." 
         data-val-range="The field Percent should be between 1 and 60." data-val-range-max="60" data-val-range-min="1" 
         data-val-regex="The field Percent should be a positive non-decimal number." 
         data-val-regex-pattern="^-?\d+$" data-val-required="The Code discount field is required." 
         id="Discounts_{{: index}}__Percent" name="Discounts[{{: index}}].Percent" type="text" value="0" aria-required="true" aria-invalid="false" 
         aria-describedby="Discounts_{{: index}}__Percent-error"> 
       <span class="help-block field-validation-valid" data-valmsg-for="Discounts[{{: index}}].Percent" data-valmsg-replace="true"></span> 
      </div> 
     </div> 
     <div class="col-md-2 form-group"> 
      <div class="input-group"> 
       <button type="button" class="btn btn-primary removeDiscountRow">Remove</button> 
      </div> 
     </div> 
    </div> 
</script> 

너처럼 면도기의 출력을 복사하여 템플릿에 삽입하는 것을 볼 수 있습니다. 따라서 모델에서 유효성 검사를 변경하면 매번 템플릿이 변경됩니다. 클라이언트 쪽 유효성 검사를 위해 모든 데이터 특성을 보존하면서이 템플릿을 자동 생성하는 방법?

+0

다른 데이터처럼 유효성 검사 및 전달보기를 사용할 수없는 이유는 무엇입니까? – charlietfl

답변

1

입력 코드를 생성하는 것처럼 templte 코드를 생성 할 수 있지만 Model.Discounts에는 적어도 하나 이상의 요소가 있어야합니다. 아래 코드를 참조하십시오. 공백 일 경우 DiscountCode를 추가하고 일부 HTML 속성을 변경하여 원하는대로 템플릿을 표시하십시오.)

if (Model.Discounts == null || Model.Discounts.Count <= 0) 
{ 
    Model.Discounts = new List<DiscountCode> { new DiscountCode() }; 
} 
<script id="discountRow" type="text/x-jsrender"> 
    <div class="row"> 
     <input type="hidden" name="Discounts.Index" value="{{: index}}" /> 
     <div class="col-md-4 form-group"> 
      <div class="input-group"> 
       @Html.LabelFor(m => m.Discounts[0].Percent, new { @class = "control-label", For = "Discounts[{{: index}}].Code" }) 
       @Html.TextBoxFor(m => m.Discounts[0].Code, new { @class = "form-control ", Id = "Discounts_{{: index}}__Code", Name = "Discounts[{{: index}}].Code", Value="" }) 
       @Html.ValidationMessageFor(m => m.Discounts[0].Code, string.Empty, new { @class = "help-block", Data_Valmsg_For = "Discounts[{{: index}}].Code" }) 
      </div> 
     </div> 
     <div class="col-md-6 form-group"> 
      <div class="input-group"> 
       @Html.LabelFor(m => m.Discounts[0].Percent, new { @class = "control-label", For = "Discounts[{{: index}}].Percent" }) 
       @Html.TextBoxFor(m => m.Discounts[0].Percent, new { @class = "form-control ", Id = "Discounts_{{: index}}__Percent", Name = "Discounts[{{: index}}].Percent", Value = "" }) 
       @Html.ValidationMessageFor(m => m.Discounts[0].Percent, string.Empty, new { @class = "help-block", Data_Valmsg_For = "Discounts[{{: index}}].Percent" }) 
      </div> 
     </div> 
     <div class="col-md-2 form-group"> 
      <div class="input-group"> 
       <button type="button" class="btn btn-primary removeDiscountRow">Remove</button> 
      </div> 
     </div> 
    </div> 
</script> 
관련 문제