使用ViewModel的部分创建视图的数据类型不匹配

时间:2014-02-20 16:10:12

标签: asp.net-mvc razor partial-views asp.net-mvc-5

我正在使用ViewModel进行创建操作,该操作由一个类型为Device的实体和两个IEnumerable<SelectListItem>组成,用于在创建新项目时打印2个下拉列表。

public class DeviceEditViewModel
{
    public Device dev { get; set; }

    public int SelectedManufactor { set; get; }
    public IEnumerable<SelectListItem> ManufactorListItems { get; set; }

    public int SelectedCategory { set; get; }
    public IEnumerable<SelectListItem> CategoriesListItems { get; set; }

}

public ActionResult Create()
{
    var vm = new DeviceEditViewModel
    {
        CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem
        {
            Value = x.ID.ToString(),
            Text = x.Name
        }),
        ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem
        {
            Value = x.ID.ToString(),
            Text = x.Name
        })
    };
    return View(vm);
}

这本身没有任何问题,因为我可以创建,阅读和更新所有内容。 现在我想更新我的索引视图以保存部分创建视图。在页面的右侧,应该有与独立视图中相同的创建表单。

<div class="col-lg-4">
    @{ Html.RenderPartial("_Create", new DeviceEditViewModel()); }
</div>

现在运行时,我收到以下错误(免费翻译):

"SelectedManufactor" is of type "System.Int32", but requires the type "IEnumerable<SelectListItem>".

“索引”视图呈现并希望在设备控制器中调用“创建方法”。 Create方法实例化一个新DeviceEditViewModel并填充两个IEnumerable<SelectListItem>。为什么这在部分视图中失败,而不是在常规视图中失败 - 我该如何解决这个问题?

更新 Lins的回答并不完全正确,但让我走上了正确的轨道 - 在我的世界里,这个问题被视为一个支持者和接受者。

我所做的是创建DeviceIndexViewModel,其中包含EditViewModel,这是创建/编辑设备所必需的。

public class DeviceIndexViewModel
{
    public IEnumerable<Device> Devices { get; set; }
    public DeviceEditViewModel DeviceEditViewModel { get; set; }
}

现在需要相应更新索引操作:

    public ActionResult Index(string searchString)
    {
        DeviceIndexViewModel vm = new DeviceIndexViewModel();
        // ...
        // omitted
        // ...
        vm.DeviceEditViewModel = new DeviceEditViewModel() 
        {
            CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem
            {
                Value = x.ID.ToString(),
                Text = x.Name
            }),
            ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem
            {
                Value = x.ID.ToString(),
                Text = x.Name
            })
        };
        return View(vm);
    }

现在我可以用:

调用PartialView
@{ Html.RenderPartial("_Create", Model.DeviceEditViewModel); }

最后告诉partialView调用一个特定的方法:

@using (Html.BeginForm("Create", "Device", FormMethod.Post))
{
    // ... omitted
}

由于

1 个答案:

答案 0 :(得分:1)

您需要创建如下所示的DeviceEditViewModel,然后在Index视图中将其用作强类型视图,然后将对象DropDownListViewModel传递到部分视图。

public class DeviceEditViewModel
{
    public Device dev { get; set; }

    public DropDownListViewModel DropDownListViewModels { get; set; } 
}


public class DropDownListViewModel
{
    public int SelectedManufactor { set; get; }
    public IEnumerable<SelectListItem> ManufactorListItems { get; set; }

    public int SelectedCategory { set; get; }
    public IEnumerable<SelectListItem> CategoriesListItems { get; set; }
}

将对象DropDownListViewModel传递给部分视图

@{ Html.RenderPartial("_Create", Model.DropDownListViewModels);}

更改您的Create操作方法,如下所示:

public ActionResult Create()
        {
            var vm = new DeviceEditViewModel
            {
                DropDownListViewModels = new DropDownListViewModel()
                {
                     CategoriesListItems = repo.GetCategories().Select(x => new SelectListItem
                        {
                            Value = x.ID.ToString(),
                            Text = x.Name
                        }),
                        ManufactorListItems = repo.GetManufactors().Select(x => new SelectListItem
                        {
                            Value = x.ID.ToString(),
                            Text = x.Name
                        })
                }
            };
            return View(vm);
        }

您的部分观点:

@model DropDownListViewModel

@Html.DropDownListFor(n => n.SelectedManufactor, Model.ManufactorListItems)    
@Html.DropDownListFor(n => n.SelectedCategory, Model.CategoriesListItems)