首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从Retrieving Model vs Controller检索下拉列表数据

从Retrieving Model vs Controller检索下拉列表数据
EN

Stack Overflow用户
提问于 2013-10-04 15:06:07
回答 2查看 1.7K关注 0票数 0

ASP.NET MVC 4\x{e 010} C# \x{e76f} .NET 4.5 \x{e76f} Razor

我有网页服务,返回数据的下拉列表。这些数据存储在我的模型中,然后由我的视图显示。目前,我正在控制器中进行web服务调用,并在将数据传递到视图之前将数据分配给模型。

我想知道这是否是一个很好的设置,还是我应该把我的web服务调用放在我的模型中?是否有关于web服务调用的最佳实践指南?他们应该被严格地从控制员那里叫出来,还是不重要?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-04 15:13:19

除非有显著的性能影响,理想的逻辑设置将是在模型中发生这种情况。

通常的引语是,“保持你的控制器轻,你的模型重。”(我不知道是谁先这么说的。)

控制器不应该填充模型。它应该得到模型的一个实例,并将其提供给视图。它最多应该执行一些路由逻辑(确定要发送的视图,还是使用重定向响应等)。基本上,嗯,控制模型和视图/UI之间的交互。

所以,与之不同的是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ActionResult Index()
{
    var model = WidgetFactory.Create();
    model.SomeProperty = DataService.GetPropertyInfo();
    return View(model);
}

你应该这么做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public ActionResult Index()
{
    var model = WidgetFactory.Create();
    return View(model);
}

有了这一模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public SomeType SomeProperty
{
    get
    {
        return DataService.GetPropertyInfo();
    }
}

或者可能是这样,如果在获取数据时存在开销:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private SomeType _someProperty = null;
public SomeType SomeProperty
{
    get
    {
        if (_someProperty == null)
            _someProperty = DataService.GetPropertyInfo();
        return _someProperty;
    }
}

这有一个额外的好处,即就模型而言,SomeProperty变得不可变。因为它从不修改数据并且只提供数据,所以没有理由为控制器可以使用的属性设置一个setter。

这里的想法是,模型是尽可能独立和自给自足的。或尽可能封装。它本身就代表着商业概念。如果该业务概念的一部分是存在于另一个系统上的数据,则该模型将对其进行封装。控制器没有责任从物理上知道Widget从哪里获取SomeProperty的数据。它只知道Widget公开了这些数据。Widget得到的位置取决于Widget

票数 2
EN

Stack Overflow用户

发布于 2013-10-04 16:08:44

有几种方法可以做,只要你的控制器是精简和可测试的,你可以选择任何你喜欢的方法。请注意,您还希望确保视图模型简单且愚蠢。你不想把太多的行为放在视图模型中。

您的视图模型可以这样简单。在我的视图模型中,我不喜欢有太多的行为或对服务的调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyViewModel
{
    public IEnumerable<SelectListItem> CustomerList { get; set; }
}

我将创建一个简单的扩展方法或一个帮助类,将域数据转换为DropDownList视图模型,即SelectListItem

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
internal static class ListHelper
{
    internal static MyViewModel ConvertToMyViewModel(this IEnumerable<Customer> customers)
    {
        //Assign customers to CustomerList;
        //MyViewModel.CustomerList
        return new MyViewModel();
    }
}

请注意,以后可能会发现自己在任何时候想要隐藏时都会重复类似的代码。您可以始终创建通用版本,因此方法是可重用的。但关键是扩展/助手方法可以帮助您进行转换。它只做转换,但没有其他。

将您的服务注入控制器。如果您使用任何一种注射框架,请接受您的粪尿素注射框架的改进。你的控制器是可测试的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HomeController : Controller
{
    private readonly IWebService _webServiceInfo;

    public HomeController(IWebService webServiceInfo) {
        _webServiceInfo = webServiceInfo;
    }

    public ActionResult Index() {
        var customers = _webServiceInfo.GetCustomers();
        var viewModel = customers.ConvertToMyViewModel();

        return View(viewModel);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19192087

复制
相关文章
职场推进屡屡受阻,别总找借口。
很多人在职场中都有一些自己积极的想法,计划,希望推动一些改变,希望按照自己的意愿做一些优化,调整,变革。通常,这种动机是好的,方案可能也是有一定价值的。
用户1564362
2019/09/25
3730
应用程序已被 JAVA 安全阻止的解决办法
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156840.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/08
1.1K0
应用程序已被 JAVA 安全阻止的解决办法
不想装系统,有没有办法在线体验 Linux?
另外,这次分享还有承上启下的作用。承上是前几天挺受大家欢迎的《Android 手机如何改造成 Linux 服务器?》,启下是想预告:从明天开始,我会在每次发文的次条加入“轻松掌握Linux命令”系列,希望从基础的命令开始,提升 Linux 技术水平,敬请期待!
Python猫
2019/11/12
4.8K0
如何在Google搜索到我的网站?
我需要解析的域名为 taixingyiji.com,我的域名解析商是CloudFlare
taixingyiji
2022/07/25
2.3K0
如何在Google搜索到我的网站?
问答 | 有没有什么办法让GPU显存不会溢出?
社长为你推荐来自 AI 研习社问答社区的精华问答。如有你也有问题,欢迎进社区提问。 话不多说,直接上题 问:有没有什么办法让GPU显存不会溢出? 来自社友的回答 ▼▼▼ @巴特莱•芬克: 通过谷歌大部分找到的就是 GPU 显存溢出。然后 加上 CUDA_VISIBLE_DEVICES=1 Environment Variable Syntax Results CUDA_VISIBLE_DEVICES=1 Onl
AI研习社
2018/09/25
1.2K0
找不到应用程序解决办法
我在连学校内网的时候,不能自动跳转到登录的页面,因为有一些默认的配置已经被修改。可能有的人认为不是自己修改的,那么原因也有可能是软件安装的过程中默认设置被修改,也有可能是你不轻易间点错了。不废话了,直接发图:
全栈程序员站长
2022/07/22
1.6K0
找不到应用程序解决办法
C语言快学完了,但oj上的题大部分做不出来,都是在CSDN找的,是不是很不正常?有没有办法改?
至今还是有很多人觉得C语言依然是编程行业最基础的东西,毕竟现在很多上了年龄的人在当时大学阶段初级的入门编程语言就是用的C语言,在很多人心中都有个编程梦,有些甚至年过半百了还琢磨自己这辈子没有玩编程而遗憾,也有很多上了年纪的人拿起C语言的书籍一步步跟着网络上的教材进行学习,随着编程语言在国内的普及,编程语言的生态已经发生了很大的变化,特别是高级语言的普及化,倒是显得很多底层语言在编程领域的影响力在下降,但是其重要性还是在加强,就拿C语言来讲是很多编程语言的基础而存在,主流很多编程语言的底层实现就是利用的C语言或者汇编来完成,C语言在编程领域的角色在发生变化,在早期一个很简单的功能模块可能都需要C语言实现很长时间才能稳定,但在今天可能就是另外的一种模式存在了。
程序员互动联盟
2020/09/22
1.3K0
C语言快学完了,但oj上的题大部分做不出来,都是在CSDN找的,是不是很不正常?有没有办法改?
“夸克,你的‘小心思’撩到我了”
“我们宣布,Internet Explorer 11桌面应用程序将于2022年6月15日退役。”随着Microsoft Edge项目经理Sean Lyndersay的宣告,IE浏览器的生命进入了倒计时。
曾响铃
2021/06/09
1.3K0
“夸克,你的‘小心思’撩到我了”
Exception [WinError 995] 由于线程退出或应用程序请求 的解决办法
Windows 10 系统下,IPython 解释器内执行某些程序,会导致出现类似如下报错:
Alan Lee
2021/12/07
1.6K0
Struts Validator有没有办法只生成一些我们定制的?共用的进行引入
阅读更多 http://community.csdn.net/Expert/TopicView.asp?id=3874963 http://www.cjsdn.net/post/view?bid=2
阿敏总司令
2019/02/28
8490
【AI绘画】美到我的心巴上
昨天去公园玩耍的时候,看到一处开满了一种花,很是好看,像是一串串的铃铛。在网上搜了一下才知道是叫毛地黄。毛地黄是玄参科、毛地黄属一年生或多年生草本植物。除花冠外,全体被灰白色短柔毛和腺毛,有时茎上几无毛,高60-120厘米。茎单生或数条成丛。 叶基生,莲座状,为卵圆形或卵状披针形,叶缘有圆锯齿,叶柄具狭翅,叶形由下至上渐小;花朵有粉红色和蜡紫红色,顶生,总状花序,花冠钟形,内有浅白边缘的深紫红色斑点。
不是海碗
2023/03/01
9570
【AI绘画】美到我的心巴上
找bug的过程
https://www.cnblogs.com/pythonywy/p/11006273.html
小小咸鱼YwY
2019/07/24
3430
看我是如何把SQLMap里的功能移植到我的程序的
不知道各位有没有听过不要重复造轮子?因为有些开源的工具,它们经过时间和众人的捶打,其实会比我们自己一个人造出来的轮子考虑的更加周到和全面。可是有时候有些开源工具的入口太沉重,而我们只需要其中的一部分功能并且加到我们自己的程序,所以怎么样把她们进行提炼成我们想要的呢? 介绍 最近想给自己的程序加上一个检测WAF的功能,思路可能很简单,就是构成一些存在恶意参数的URL地址,然后检测返回的response的headers或者body,通过指纹匹配的方式来定位是哪一款WAF,可是自己收集WAF信息太多了,而且写检测
企鹅号小编
2018/01/31
7350
看我是如何把SQLMap里的功能移植到我的程序的
应用程序0xc000005解决办法
应用程序无法正常启动0xc000005的解决方法 1、右击显示无法正常启动0xc000005的应用程序,弹出菜单中选择属性。
全栈程序员站长
2022/07/22
2.3K0
应用程序0xc000005解决办法
软件打包,有没有更好的方法?!
最近,一位朋友分享了关于亚马逊内部构建系统(https://gist.github.com/terabyte/15a2d3d407285b8b5a0a7964dd6283b0)的设计要点,这也让我对于软件打包这事有了新的认识。
深度学习与Python
2023/10/16
2330
软件打包,有没有更好的方法?!
出现ctfmon.exe应用程序错误一种的解决办法。
1、点击[开始菜单] 2、点击[运行] 3、点击[打开] 4、点击[确定] 5、点击[启动]
裴来凡
2022/05/28
3.1K0
出现ctfmon.exe应用程序错误一种的解决办法。
飞总聊IT的2019年
2019年转眼就过去两周了。两周前写完2018年总结的时候,我就问自己的2019年的公众号要做什么不要做些什么。两周以来伴随我对公众号的更新,这个问题也有了比较明晰的想法。
用户1564362
2019/05/07
6900
飞总聊IT的2019年
linux服务器的硬盘使用时间查询
又快到双11和黑色星期五了,国内外特价VPS,云服务器,独立服务器都在要促销了,o( ̄︶ ̄)o,mjj你们准备好银子和刀了么。记录一下linux服务器的硬盘使用时间查询。 更新和安装smartmontools (以debian和ubuntu) apt-get update && apt-get upgrade Bash apt install smartmontools -y Bash 查一下盘 fdisk -l Bash 运行smartmontools的命令查询 smartctl -A /dev
小沨
2020/12/28
2.9K0
电脑使用时间过长,如何开始护眼模式减少屏幕的蓝光?
1、点击[开始菜单] 2、点击[运行] 3、点击[打开] 4、点击[确定] 5、点击[HKEY_LOCAL_USER] 6、点击[Control Panel] 7、点击[Colors] 8、点击[Windows] 9、点击[修改] 10、点击[数值数据] 11、点击[确定]
裴来凡
2022/05/28
1.3K0
电脑使用时间过长,如何开始护眼模式减少屏幕的蓝光?
点击加载更多

相似问题

在AWS Api网关中使用API密钥

11

AWS网关中的刷新API密钥

17

在AWS API网关中映射API密钥和外部帐户Id

10

在Amazon网关中使用API密钥

1012

AWS API网关中的单点登录

10
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文