2015-10-07 141 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'对象数据。 –