2017-09-19 9 views
0

メインビューと部分ビューを使用して、ModelViewsでフィールドを動的に追加します。問題はModelState.isValidで、部分的なビューには検証に失敗した2つのフィールドがあるため、常に降下します。これらのフィールドは強制的なものではありませんので、私はnullableにしましたが、それでもこれらは検証されています。どのようにこの状況を克服することができますか?部分ビューで動的に追加されたフィールドで常に検証が実行されます

コード: ビューメイン:

@model ViewModel.EnquiryVM 

@using (Html.BeginForm("Create", "Enquiries", FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 

     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.EnquiryNumber, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-3"> 
       @Html.EditorFor(model => model.EnquiryNumber, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.EnquiryNumber, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.ClientID, "Client", htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-3"> 

       @Html.DropDownListFor(u => u.ClientID, (IEnumerable<SelectListItem>)Model.Clients, "--Select--") 
       @Html.ValidationMessageFor(model => model.ClientID, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div id="LineItems"> 
       <div id="editorRowsLineitems"> 
        @foreach (var item in Model.LineItems) 
        { 
         @Html.Partial("_CreateEnquiryItem", item) 
        } 
       </div> 
       @Html.ActionLink("Add Items", "CreateLineItem", null, new { id = "addItem", @class = "button" }); 

     </div> 
     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
<script type="text/javascript"> 
    $(function() { 
     $('#addItem').on('click', function() { 
      $.ajax({ 
       url: '@Url.Action("CreateLineItem")', 
        cache: false, 
        success: function (html) { 
         $("#editorRowsLineitems").append(html); 

         $('form').data('validator', null); 
         $.validator.unobtrusive.parse($('form')); 
        } 
       }); 
       return false; 
      }); 
     $('#editorRowsLineitems').on('click', '.deleteRow', function() { 
       $(this).closest('.editorRow').remove(); 
      }); 
     $('form').data('validator', null); 
     $.validator.unobtrusive.parse($('form')); 
    }); 


</script> 
} 

部分図:

@model ViewModels.EnquiryLineItemVM 

<div class="editorRow"> 
    @using (Html.BeginCollectionItem("LineItems")) 
    { 
     <table class="table"> 

      <tr> 
       <td> 
        @Html.EditorFor(model => model.ItemDesc) 

       </td> 
       <td> 
        @Html.EditorFor(model => model.Quantity) 

       </td> 

       <td> 
        @Html.DropDownListFor(model => model.ManufacturerId, Model.ManufacturerList, "--Please Select--") 

       </td> 
       <td> 

        <a href="#" class="deleteRow">Delete</a> 
       </td> 
      </tr> 
     </table> 

    } 

のviewmodels:

public class EnquiryVM 
    { 
     public int ID { get; set; } 

     [Required] 
     public string EnquiryNumber { get; set; } 
     public int ClientID { get; set; } 
     public IEnumerable<SelectListItem> Clients { get; set; } 
     public int ItemID { get; set; } 
     public List<EnquiryLineItem> LineItems { get; set; } 

    } 
    public class EnquiryLineItemVM 
    { 
     public int? EnquiryID { get; set; } //nullable but still validation fires 
     [Required] 
     public string ItemDesc { get; set; } 
     public int Quantity { get; set; } 
     public int? ManufacturerId { get; set; } // this too fires 
     public IEnumerable<SelectListItem> ManufacturerList { get; set; } 
    } 

コントローラのアクションメソッド

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(EnquiryVM enquiryVM) 
     { 
      var errors = ModelState.Keys.Where(k => ModelState[k].Errors.Count > 0).Select(k => new { propertyName = k, errorMessage = ModelState[k].Errors[0].ErrorMessage });// for error debugging shows Validation errors for EnquiryID and ManufacturerID 
      var enquiry = new Enquiry(); 
      enquiry.EnquiryNumber = enquiryVM.EnquiryNumber; 
      enquiry.ClosingDate = enquiryVM.ClosingDate; 
      enquiry.RFQSentDate = enquiryVM.RFQSentDate; 
      enquiry.ClientID = enquiryVM.ClientID; 
      enquiry.DivisionID = enquiryVM.DivisionID; 
      enquiry.EnquiryLineItems = enquiryVM.LineItems; 

      if (ModelState.IsValid) 
      { 
       db.Enquiries.Add(enquiry); 
       enquiryVM.ID = enquiry.ID; 
       foreach (var item in enquiry.EnquiryLineItems) 
       { 
        if (enquiryVM.ID != null) 
        { 
         item.EnquiryID = (int)enquiryVM.ID; 
        } 
        db.EnquiryLineItems.Add(item); 
       } 

       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      var viewModel = GetAllCategories(); 
      return View(viewModel); 
     } 

これを修正できません。御時間ありがとうございます。

ManufacturerIDEnquiryIDはModelで使用されているFK関係ですが、これらのフィールドではnull可能なViewModelsを使用しています。

enter image description here

答えて

1

EnquiryVMLineItems properyはtypeof演算List<EnquiryLineItem>ですが、あなたは、コレクションのために示されているモデルはEnquiryLineItemVM、ないEnquiryLineItemです。

私はEnquiryLineItemはあなたがデータモデルであり、画像内ModelStateエラーに基づいて、EnquiryIdManufacturerIdの両方がそのデータモデルでnullとしてマークされていないと仮定します。

public class EnquiryVM 
{ 
    public int ID { get; set; } 
    [Required] 
    public string EnquiryNumber { get; set; } 
    .... 
    public List<EnquiryLineItemVM> LineItems { get; set; } // change 

} 
public class EnquiryLineItemVM 
{ 
    .... 
} 
あなた EnquiryLineItemVMビューモデルを使用するように EnquiryVMを変更

関連する問題