我正在使用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
}
由于
答案 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)