2016-01-14 5 views
1

У меня есть таблица вызова AB_Product_vs_Field в этой таблице я следующие столбцыИзменить вид в ASP.NET MVC

  • PRODUCT_ID
  • FIELD_ID
  • FIELD_VALUE

когда я прохожу Product_ID и Field_ID I хотите найти реляционную запись в этой таблице и загрузить соответствующие Field_Value.

Так что я написал следующий код

[HttpGet] 
    public ActionResult Edit(string Product_ID , string Field_ID) 
    { 
     if ((db.AB_Product_vs_Field.Any(u => u.Product_ID == Product_ID))&(db.AB_Product_vs_Field.Any(u => u.Field_ID == FieldID))) 
     {   
      var product_values = new ProductEdit 
      { 
       ListProductFields = db.AB_Product_vs_Field.Where(p => p.Field_ID == FieldID).ToList(), 
       ListProductLables = db.AB_ProductTypeCategoryField.Where(p => p.ProductFieldID == FieldID).ToList(), 
       Pager = pager 
      }; 

     return View(product_values);   

     } 

    } 

это ProductEdit модель класса

public class ProductEdit 
    { 
     public string Product_ID { get; set; } 
     public string Field_ID { get; set; } 
     public IList<AB_Product_vs_Field> ListProductFields { get; set; } 
     public IList<AB_ProductTypeCategoryField> ListProductLables { get; set; }  

     public IEnumerable<string> Items { get; set; } 
     public PaginationModel.Pager Pager { get; set; } 


     public int PageSize { get; set; } 
     public int PageCount { get; set; } 
     public int CurrentPageIndex { get; set; } 

    } 

это соответствующие классы модели

public partial class AB_ProductTypeCategoryField 
{ 
    public string ProductFieldID { get; set; } 
    public string ProductFieldNameEn { get; set; }   
} 

public partial class AB_Product_vs_Field 
{ 
    public string Product_ID { get; set; } 
    public string Field_ID { get; set; } 
    public string Field_Value { get; set; }    
} 

это вид этой редакции

@model albaraka.Models.ProductEdit 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @for (int i = 0; i < Model.ListProductFields.Count; i++) 
     { 
      <div class="form-group"> 
       @Html.LabelFor(x => x.ListProductLables[i].ProductFieldNameEn, Model.ListProductLables[i].ProductFieldNameEn, htmlAttributes: new { @class = "control-label col-md-2" }) 
       <div class="col-md-10"> 
        @Html.HiddenFor(m => m.ListProductFields[i].Field_ID) 
        @Html.TextAreaFor(m => m.ListProductFields[i].Field_Value, new { @class = "form-control", @row = 5 })     
       </div> 
      </div>   

      <div class="form-group"> 
       <div class="col-md-offset-2 col-md-10"> 
        <input type="submit" value="Save Details" class="btn btn-success" /> 
       </div> 
      </div> 

     } 
    </div> 
} 

тогда я получаю ошибку Измельчитель индекс

был вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

Что не так с моим подходом, как правильно загрузить?

+1

Просмотреть всю свою ошибку. Он укажет вам, где находится строка, вызывающая эту ошибку, и то, что является исходным файлом. –

+1

его строка '@ Html.LabelFor (x => x.ListProductLables [i] .ProductFieldNameEn, Model.ListProductLables [i] .ProductFieldNameEn, htmlAttributes: new {@class =" control-label col-md-2 "}) ' – kez

+1

Контроллер IN заполняет его как var abProduct = db.AB_Product_vs_Field.Where (p => p.Field_ID == FieldID) .ToList(); ListProductFields = от А в abProduct выбрать новый AB_Product_vs_Field { PRODUCT_ID = abProduct.Product_ID, FIELD_ID = abProduct.Field_ID, FIELD_VALUE = abProduct.Field_Value } –

ответ

1

Вы цикл приращением ListProductFields коллекции, но внутри вас есть

@Html.LabelFor(x => x.ListProductLables[i].ProductFieldNameEn.... 

Я предполагаю, что это должно быть

@Html.LabelFor(x => x.ListProductFields[i].someProperty 

Если ListProductLables не содержит точно такое же количество элементов, как ListProductLables, ваш получит исключение

+0

Я думаю, что этот запрос LINQ порождают проблему 'ListProductFields = db.AB_Product_vs_Field.Where (p => p.Field_ID == FieldID) .ToList(), ' Я хочу выбрать определенную строку, но похоже, что она захватывает несколько строк, не так ли? – kez

+0

Если вам нужна только одна строка, используйте «.Where (p => p.Field_ID == FieldID) .FirstOrDefault();' и сделайте ваше свойство 'public AB_Product_vs_Field ListProductFields {get; задавать; } '(т. е. не коллекция). И то же самое для 'ListProductLables'. И, конечно, вы можете удалить петлю в представлении –

+1

. Я хочу найти определенную строку, используя 2 параметра. Поэтому я пробовал вот так: 'ListProductFields = db.AB_Product_vs_Field.Where ((db.AB_Product_vs_Field.Any (u => u. Product_ID == Product_ID)) & (db.AB_Product_vs_Field.Any (u => u.Field_ID == Field_ID))) ToList(), ' , но это имеет кратковременную ошибку – kez

0

Вы должны изменить '&' оператора к '& &' оператор:

if ((db.AB_Product_vs_Field.Any(u => u.Product_ID == Product_ID))&&(db.AB_Product_vs_Field.Any(u => u.Field_ID == FieldID))) 

Также в представлении вы ссылаетесь неправильный массив:

изменение:

@Html.LabelFor(x => x.ListProductLables[i].ProductFieldNameEn, Model.ListProductLables[i].ProductFieldNameEn, htmlAttributes: new { @class = "control-label col-md-2" }) 

:

@Html.LabelFor(x => x.ListProductFields[i].ProductFieldNameEn, Model.ListProductFields[i].ProductFieldNameEn, htmlAttributes: new { @class = "control-label col-md-2" }) 
1

Большинства из возможных причин:

@for (int i = 0; i < Model.ListProductFields.Count; i++) 
     { 
      <div class="form-group"> 
       @Html.LabelFor(x => x.ListProductLables[i].ProductFieldNameEn, Model.ListProductLables[i].ProductFieldNameEn, htmlAttributes: new { @class = "control-label col-md-2" }) 

Здесь вы предполагаете, в for условия цикла, что ListProductFields.Count будет = к ProductFieldNameEn.Count, но они, кажется, не равен колу.

Смежные вопросы