c# – 在视图模型中使用存储库可以吗?

c# – 在视图模型中使用存储库可以吗?,第1张

概述假设我有复杂的视图模型,有很多数据,如国家/地区,产品,类别等的列表,我每次创建ViewModel时都需要从数据库中获取数据. 我想要解决的主要问题是,当我处理POST *** 作时,一些TestModel发布的值不正确,导致ModelState.IsValid为false,那么我必须返回与当前发布的模型相同的视图.这迫使我再次获得我的类别列表,因为我在GET *** 作中这样做.这在控制器中增加了很多重复的代码 假设我有复杂的视图模型,有很多数据,如国家/地区,产品,类别等的列表,我每次创建viewmodel时都需要从数据库中获取数据.

我想要解决的主要问题是,当我处理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# – 在视图模型中使用存储库可以吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存