我想要解决的主要问题是,当我处理POST *** 作时,一些TestModel发布的值不正确,导致ModelState.IsValID为false,那么我必须返回与当前发布的模型相同的视图.这迫使我再次获得我的类别列表,因为我在GET *** 作中这样做.这在控制器中增加了很多重复的代码,我想删除它.目前我正在做以下事情:
我的模型和视图模型:
模型,实体存储在数据库中:
public class category{ public int ID { get; set; } public string name { get; set; } public IEnumerable<category> SubCategorIEs { get; set; }}
查看型号:
public class categoryModel{ public int ID { get; set; } public string name { get; set; }}public class TestModel{ [required] [MaxLength(5)] public string Text { get; set; } public int Selectedcategory { get; set; } public IEnumerable<categoryModel> CategorIEs { get; set; } public SelectList CategorIEsList { get { var items = CategorIEs == null || !CategorIEs.Any() ? Enumerable.Empty<SelectListItem>() : CategorIEs.Select(c => new SelectListItem { Value = c.ID.ToString(),Text = c.name }); return new SelectList(items,"Value","Text"); } }}
我的控制器:
public class HomeController : Controller{ private Readonly Repository _repository = ObjectFactory.GetRepositoryInstance(); public ActionResult Index() { var model = new TestModel { CategorIEs = _repository.CategorIEs.Select(c => new categoryModel { ID = c.ID,name = c.name }) }; return VIEw(model); } [httpPost] public ActionResult Index(TestModel model) { if (ModelState.IsValID) { return RedirectToAction("Succes"); } model.CategorIEs = _repository.CategorIEs.Select(c => new categoryModel { ID = c.ID,name = c.name }); return VIEw(model); } public ActionResult Succes() { return VIEw(); }}
我想删除重复的类别抓取和映射,基本上这个代码:
.CategorIEs = _repository.CategorIEs.Select(c => new categoryModel { ID = c.ID,name = c.name })
来自控制器.另外我想删除ModelState的有效性检查,只有当ModelState.IsValID保持控制器代码AS CLEAN AS POSSIBLE时,我想执行该 *** 作.到目前为止,我有以下解决方案来删除ModelState有效性检查:
创建自定义ValIDatemodelattribute
public class ValIDatemodelattribute : ActionFilterattribute{ public overrIDe voID OnActionExecuting(ActionExecutingContext filterContext) { var vIEwData = filterContext.Controller.VIEwData; if(vIEwData.ModelState.IsValID) return; vIEwData.Model = filterContext.ActionParameters["model"]; filterContext.Result = new VIEwResult { VIEwData = vIEwData,}; } }
现在模型在动作执行之前被验证.在验证错误的情况下,我们使用与最近发布的相同模型相同的视图.因此,控制器POST *** 作如下所示:
[httpPost][ValIDatemodelattribute]public ActionResult Index(TestModel model){ // Do some important stuff with posted data return RedirectToAction("Success");}
这是很好的,但现在我的TestModel的CategorIEs属性是空的,因为我必须从数据库中获取类别,并相应地映射它们.那么可以修改我的视图模型看起来像这样:
public class TestModel{ private Readonly Repository _repository = ObjectFactory.GetRepositoryInstance(); ... public int Selectedcategory { get; set; } public IEnumerable<categoryModel> CategorIEs { get { return _repository.CategorIEs.Select(c => new categoryModel { ID = c.ID,name = c.name }); } } ...}
这将使我们拥有非常干净的控制器,但不会导致某种性能或架构问题?观看模式不会违背单一责任原则吗? viewmodels应该负责获取所需的数据吗?
解决方法 没关系视图模型应主要由服务/查询甚至控制器填充的DTO.以前的版本没有问题,你的控制器只是几行代码.但是您的存储库并不是一个存储库,它是一个ORM.一个适当的存储库(这里只是一些查询对象)将直接返回视图模型的类别列表.
关于你的自动验证属性,不要重新发明轮子,别人(在这种情况下我)做了before.
总结以上是内存溢出为你收集整理的c# – 在视图模型中使用存储库可以吗?全部内容,希望文章能够帮你解决c# – 在视图模型中使用存储库可以吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)