从 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<SelectListItem> getOptions get; set;
并在控制器中设置值 - 视图模型属性不应调用数据库(并且您当前的实现意味着它不可能进行单元测试)
谢谢。我有这样的感觉。如果您想提交它作为答案,我可以给您。
【参考方案1】:
您每次访问该属性时都会调用 WebApiHelper.Download()
,如果您正在编辑集合,您当前的实现可能会严重降低性能。
虽然您可以定义一个私有字段(例如)private List<SelectListItem> _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 调用中获取元素的值?