我需要一些关于从soap web服务获取值以使用viewmodel显示在下拉列表中的建议,我目前从服务类库项目(n层应用程序)中找到的服务类接收各种下拉列表的数据
下拉列表服务的代码遵循与以下代码类似的格式:
public IEnumerable<SelectListItem> getValuesAsSelectItems(string selected)
{
var items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "Please Select", Value = string.Empty, Selected = (selected == string.Empty) });
foreach (var value in this.getValues())
{
items.Add(new SelectListItem { Text = value.Value, Value = value.Value, Selected = (selected == value.Value) });
}
return new SelectList(items, "Value", "Text");
}
我需要一种方法将值从此服务传递到viewmodel然后我为每个下拉列表创建了7个控制器,这些控制器将链接到我可以在整个应用程序中重用的部分视图,下拉列表包括标题,国家/地区,状态和其他人。
答案 0 :(得分:1)
您可以采取的方法是将下拉列表值提取到自己的viewmodel中。所以:
第1步:创建一个封装下拉列表项的视图模型(ItemsViewModel
):
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Models
{
public class DropDownListItem
{
public string Text { get; set; }
public string Value { get; set; }
}
public class ItemsViewModel
{
private readonly List<DropDownListItem> _items;
// The selected item:
public string SelectedItem { get; set; }
// The items:
public IEnumerable<SelectListItem> Items
{
get
{
var allItems = _items.Select(i => new SelectListItem
{
Value = i.Value,
Text = i.Text
});
return DefaultItem.Concat(allItems);
}
}
// Default item (i.e. the "select" text) if none selected
public IEnumerable<SelectListItem> DefaultItem
{
get
{
return Enumerable.Repeat(new SelectListItem
{
Value = "-1",
Text = "Select an item"
}, count: 1);
}
}
public ItemsViewModel()
{
}
// Constructor taking in items from service and selected item string:
public ItemsViewModel(List<DropDownListItem> items, string selected)
{
_items = items;
SelectedItem = selected;
}
}
}
第2步:在Views文件夹中创建一个绑定到ItemsViewModel
的部分视图:
@model Models.ItemsViewModel
@Html.DropDownListFor(m => m.SelectedItem, Model.Items)
步骤3:在适当的控制器(例如HomeController)中,放置从服务,视图模型和局部视图中提取数据的子操作:
[ChildActionOnly]
public ActionResult DropDownList(string type, string selected)
{
// If you need to call different services based on the type (e.g. Country), then pass through "type" and base the call on that
var items = new ItemsViewModel(
(from g in _service.getTitles() select new DropDownListItem { Text = g.Text, Value = g.Value }).ToList(),
selected);
return PartialView("DropDownPartial", items);
}
第4步:将此行代码放入需要下拉列表的视图中:
@Html.Action("DropDownList", "Home", new { selected = "2", type = "country" })
请注意,selected
和type
将以您认为合适的方式确定,并且是可选的。
希望这会给你一些启发。