从 Web API 调用中获取模型属性的值

Posted

技术标签:

【中文标题】从 Web API 调用中获取模型属性的值【英文标题】:Getting values for a Model property from a Web API call 【发布时间】:2016-02-06 04:33:14 【问题描述】:

目前我正在使用 API 调用填充下拉选项。在我的模型中,我有这样的东西:

public List<SelectListItem> getOptions
        
            get
            
                var options = WebApiHelper.Download<IEnumerable<T>>(
                "Controller");
                var dropDownOptions = options.Select(x => new SelectListItem  Text = x.Name, Value = x.Id.Value ).ToList();
                return dropDownOptions;
            
        

这在 .cshtml 中的几个地方被调用(例如,见下文):

 @Html.DropDownListFor(m => m.someProperty, Model.getOptions)

List<SelectListItem> GetDropdownOptions()
        
            var currentDropdownItems = Model.getOptions;
            //some other code to modify dropdown options.
        

当我调用 Model.getOptions 时,Web API 是否只会被点击一次?还是每次都调用它,因为它在该属性的 get 内?如果是后者,该问题有什么好的解决方法?

编辑:再想一想,让这些控制器填充该属性的值会更好吗?我感觉每次调用 model.getoptions 都会调用 api。

【问题讨论】:

是的,每次访问该属性时都会调用您的数据库。使您的属性public List&lt;SelectListItem&gt; getOptions get; set; 并在控制器中设置值 - 视图模型属性不应调用数据库(并且您当前的实现意味着它不可能进行单元测试) 谢谢。我有这样的感觉。如果您想提交它作为答案,我可以给您。 【参考方案1】:

您每次访问该属性时都会调用 WebApiHelper.Download(),如果您正在编辑集合,您当前的实现可能会严重降低性能。

虽然您可以定义一个私有字段(例如)private List&lt;SelectListItem&gt; _Options; 并在 getter 中,检查其是否为 null,如果是,请使用您的 WebApiHelper.Download() 方法填充它,然后使用 return _Options; 这仍然不是首选实现,因为您无法轻松地对应用进行单元测试。

private List<SelectListItem> _options;
public List<SelectListItem> getOptions

  get
  
    if (_options == null)
    
      _options = // call your service
    
    return _options;
  

让您的视图模型尽可能地笨拙,并让您的财产

public List<SelectListItem> Options  get; set; 

在控制器中,初始化您的模型并调用WebApiHelper.Download() 来填充集合(并将WebApiHelper 注入到您的控制器中)

【讨论】:

以上是关于从 Web API 调用中获取模型属性的值的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 和 XmlElement() 如何从 API 调用中获取元素的值?

Volist标签

构建期间调用的 setState() 或 markNeedsBuild() - 设置从 API 获取的变量的值时?

在web api c#的对象列表中添加多个值

同时从 API 调用和模型文件中解码 Codable 结构

如何从自定义模型对象数组中获取特定键的值