访问嵌套视图模型中的变量



我有以下ViewModel,我找不到一种方法来访问变量来执行选择操作

 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. 我真的需要一个ViewModel像OptionValue_SetVal吗?
  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 ÒptionValue_SetValue and placed a collection of ÒptionValues代替。

控制器

    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();

如果我正确理解您的问题,您正试图将单个对象分配给不允许的集合。

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提到的单独服务中。

相关内容

  • 没有找到相关文章

最新更新