当前位置: 首页 > 编程语言 > C#

MVC4编辑控制器-查看多对多关系和复选框分享

时间:2023-04-11 12:01:34 C#

MVC4编辑控制器/查看多对多关系和复选框我正在使用ASP.NETMVC4和实体框架,我'我正在寻找某种方法在我的数据库中创建多个关系和复选框以创建/编辑控制器和视图,我找到了@Slauma的答案CreateinMVC4-manytomanyrelationshipandCheckboxes但是,我真的很喜欢了解这如何扩展到编辑和删除功能以及此解决方案中的一些其他合作伙伴。有人可以解释如何在“选中”和“未选中”值的编辑控制器方法中填充ClassificationSelectViewModel吗?这是一个MattFlowers的问题,也能解决我的问题。以下是此答案的延续,它描述了为实体Subscription和Company之间具有多对多关系的模型创建GET和POST操作Company。将所有EF代码放入控制器操作中,而不是将其提取到扩展和服务方法中):CompanySelectViewModel保持不变:publicclassCompanySelectViewModel{publicintCompanyId{get;放;}公共字符串名称{得到;放;}publicboolIsSelected{得到;放;}}SubscriptionEditViewModel是SubscriptionCreateViewModel加上Subscription的关键属性:publicclassSubscriptionEditViewModel{publicintId{get;放;}publicint金额{得到;放;}publicIEnumerableCompanies{get;放;}}GET操作可能如下所示:publicActionResultEdit(intid){//使用请求的id从数据库加载订阅//连同其当前相关公司(仅他们的id)vardata=_context.Subscriptions。其中(s=>s.SubscriptionId==id).Select(s=>new{ViewModel=newSubscriptionEditViewModel{Id=s.SubscriptionIdAmount=s.Amount},CompanyIds=s.Companies.Select(c=>c.CompanyId)}).SingleOrDef错误();如果(数据==null)返回HttpNotFound();//从数据库中加载所有公司data.ViewModel.Companies=_context.Companies.Select(c=>newCompanySelectViewModel{CompanyId=c.CompanyId,Name=c.Name}).ToList();//设置IsSelected标志:如果公司//已经与订阅相关,则为true(=选中复选框);false,如果不是foreach(data.ViewModel.Companies中的varc)c.IsSelected=data.CompanyIds.Contains(c.CompanyId);返回视图(data.ViewModel);}编辑视图是创建视图的隐藏字段加上订阅的关键属性Id:@modelSubscriptionEditViewModel@using(Html.BeginForm()){@Html.HiddenFor(model=>model.Id)@Html.EditorFor(model=>model.Amount)@Html.EditorFor(model=>model.Companies)@Html.ActionLink("Cancel","Index")}选择公司的编辑器模板保持不变:@modelCompanySelectViewModel@Html.HiddenFor(模型=>model.CompanyId)@Html.HiddenFor(model=>model.Name)@Html.LabelFor(model=>model.IsSelected,Model.Name)@Html.EditorFor(model=>model.IsSelected)POST动作可能是这样的:[HttpPost]publicActionResultEdit(SubscriptionEditViewModelviewModel){if(ModelState.IsValid){varsubscription=_context.Subscriptions.Include(s=>s.Companies).SingleOrDefault(s=>s.SubscriptionId==viewModel.Id);if(subscription!=null){//更新标量属性,如“Amount”subscription.Amount=viewModel.Amount;//或更通用的多个标量属性//_context.Entry(subscription).CurrentValues.SetValues(viewModel);//但只有当您在ViewModel和实体中使用相同的键属性名称//和实体foreach(varcompanyinviewModel.Companies){if(company.IsSelected){if(!subscription.Companies.Any(c=>c.CompanyId==company.CompanyId)){//如果公司被选中但还没有//在数据库中关联,添加关系varaddedCompany=newCompany{CompanyId=company.CompanyId};_context.Companies.Attach(addedCompany);subscription.Companies.Add(addedCompany);}}else{varremovedCompany=subscription.Companies.SingleOrDefault(c=>c.CompanyId==company.CompanyId);if(removedCompany!=null)//如果未选择公司但当前//在数据库中相关,则删除关系subscription.Companies.Remove(removedCompany);}}_context.SaveChanges();}返回RedirectToAction("索引");}返回视图(视图模型);}删除操作并不难在GET操作中,您可以加载一些订阅属性以在删除确认时显示`。//不需要包含相关公司returnView(viewModel);}在POST操作中,加载实体然后将其删除。不需要包括公司,因为在多对多关系中,链接表上的级联删除(通常)是启用的,这样数据库将负责删除链接条目以及父订阅:多共享的所有内容-关系和复选框,如果对你有用,需要了解更多C#学习教程,希望你多多关注——[HttpPost,ActionName("Delete")]publicActionResultDeleteConfirm(intid){varsubscription=_context.Subscriptions.Find(id);如果(订阅!=null)_context.Subscriptions.Remove(订阅);返回RedirectToAction("索引");}本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢