2015-10-07 100 views
2

我有以下視圖模型,我無法找到一個方法來訪問的變量進行選擇操作訪問變量

public class ViewOptionValues 
{ 
    public Option Option { get; set; } 
    public IEnumerable<OptionValue_SetVal> Values { get; set; } 
} 

public class OptionValue_SetVal 
{ 
    public OptionValue OptionValue { get; set; } 
    public IEnumerable<SetValue> SetValues { get; set; } 
} 

public class Option 
{ 
    public int OptionID { get; set;} 
    public string OptionName { get; set; } 

    public int LsystemID { get; set; } 

    public virtual ICollection<OptionValue> OptionValues { get; set; } 
} 

public class OptionValue 
{ 
    public int OptionValueID { get; set; } 
    public string OptionVal { get; set; } 

    public int OptionID { get; set; } 

    public virtual Option Option { get; set; } 
    public virtual ICollection< SetValue> SetValue { get; set; } 
} 

public class SetValue 
{ 
    public int SetValueID { get; set; } 
    public string Value { get; set; } 
    public bool Status { get; set; } 

    public int OptionValueID { get; set; } 

    public virtual OptionValue OptionValue { get; set; } 
} 

我已經加入模型類的選項,以明確它有一個選項值集合,我的選項類有一個SetValues集合。

我有兩個問題:

  1. 我真的需要像OptionValue_SetVal一個ViewModel?
  2. 如何從我的控制器設置SetVal對象的值?

我想實現

選擇一個父類的選項,我能夠通過var op實現所有OptionValues。現在通過var setVal我試圖填充IEnumerable<SetVal> for each OptionValue`。

的事情,我沒有

  1. 訪問中填充爲其SetVal需求OptionValue的ID。
  2. 填充SetVal

這是我的控制器(它在增加值SETVAL行生成錯誤)

public ActionResult ViewOptionvalues(int id) 
    { 
     var viewModel = new ViewOptionValues(); 
     if (id != 0) 
     { 
      var op = db.Option.Include(x => x.OptionValues).FirstOrDefault(x => x.OptionID == id); 
      if(op!=null) 
      { 
       op.OptionValues= 
       var setval = db.OptionValue.Include(x => x.SetValue).FirstOrDefault(x => x.OptionValueID == op.OptionID); 
       viewModel.Values = setval.SetVal; 
       viewModel.OptionValues = op.OptionValues; 
      } 
     } 
    } 

編輯

基於我已刪除了評論而不是使用ViewModel?

控制器

public ActionResult ViewOptionValues(int id) 
    { 
     var viewmodel = new Option_OptionValues(); 
     var op = db.Option.Include(x => x.OptionValues).FirstOrDefault(x => x.OptionID == id); 
     var set = db.OptionValue.Include(x => x.SetValue).FirstOrDefault(x => x.OptionValueID == id); //set is being populated, but I am not sure what need to be placed instead of id in this line 
     if(op!=null) 
     { 
      viewmodel.OptionValues = op.OptionValues; 

     } 
     return View(viewmodel); 
    } 

查看

@foreach (var item in Model.OptionValues) 
{ 
    <tr> 
     <td rowspan="@item.SetValue.Count">@item.OptionVal</td> 
     <td rowspan="@item.SetValue.Count">@item.OptionValueID</td> 
     @{var set = item.SetValue.FirstOrDefault(x => x.OptionValueID == item.OptionValueID);} 
      @if (set != null) 
     { 

      for (int i = 0; i < item.SetValue.Count; i++) 
      { 
       <tr> 
        <td>@set.TcSet.SetName</td> 
        <td> @set.Value</td>  
        <td>@set.Status</td> 
        </tr> 
      } 

     } 
     </tr> 
} 

在視圖中我做的控制器邏輯(這是不正確的),但對於的SetValue ..計數不能得到不同的值是對的,但我得到的價值是相同的。

編輯

新增加入

 var set = (from o in db.Option 
        join ov in db.OptionValue on o.OptionID equals ov.OptionID 
        join s in db.SetValue on ov.OptionValueID equals s.OptionValueID 
        where o.TechnicalCharacteristicID == s.TcSet.TechnicalCharacteristicID 
        select ov.SetValue).SingleOrDefault(); 
+2

「下面的視圖模型」,「以下」:你忘了張貼代碼? –

+0

是的..在一分鐘內發佈它 – Vini

+0

@ViniVasundharan你能詳細說明,你會得到什麼樣的構建錯誤?看起來你提供了不完整的代碼「op.OptionValues =」if(op!= null){...之後......也請用你在代碼中發佈的確切變量名稱來優化你的問題。 –

回答

1

如果我理解你的問題正確,你想一個對象分配到這是不允許的集合。

var setval = db.OptionValue.Include(x => x.SetValue).FirstOrDefault(x => x.OptionValueID == op.OptionID); //Notice FirstOrDefault(...) 

作爲一個快速(&當然髒!)的解決方法,您可以嘗試使用以下:

viewModel.Values = new List<OptionValue_SetVal> {new OptionValue_SetVal{} }; 
viewModel.Values.First().SetValues = new List<SetValue> { setval }; 
//Assuming you have only one OptionValue_SetVal that hold setVal. Otherwise as a simple step you can go with foreach loop to make things work before you refactor. 

注:作爲一個更好的方法,你可以在類或獨立的業務範圍內按@Jason提到的這些默認集合初始化邏輯移動到一個構造函數。

希望這有助於你...

+0

我不確定我是否理解正確。您嘗試實例化OptionValue_SetValue的列表以及OptionValue_SetValue內的SetValue的列表。 – Vini

+0

我已經用新控制器和錯誤更新了問題。 – Vini

+0

@ViniVasundharan根據您更新的代碼和錯誤,我看到您正嘗試將一個集合/列表分配給不允許的單個對象。因此,如果您認爲您將獲得'OptionValues'數據的集合,那麼您還需要在viewmodel中保存一個集合,或者僅篩選和分配從db獲取的所需單個'OptionValue'對象數據。 –