首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从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

复制
相关文章

相似问题

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