我有以下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; }
}


我为Option添加了模型类,以使其明确具有Option Value的集合,而我的Option类具有SetValues的集合。

我有两个问题:


我真的需要像OptionValue_SetVal这样的ViewModel吗?
如何从控制器设置SetVal对象的值?


我正在努力实现的目标

选择我可以通过var op实现的Parent类Option的所有OptionValues。现在通过var setVal我试图填充IEnumerable<SetVal> for each OptionValue`。

我失败的事情


访问需要为其填充SetVal的OptionValue的ID。
填充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_SetValueand 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提到的单独服务中。

希望这对您有帮助...

关于c# - 在嵌套 View 模型中访问变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32991282/

10-14 06:51