使用viewmodel将soap web服务中的值分配给下拉列表

时间:2013-03-14 14:18:21

标签: web-services asp.net-mvc-4 viewmodel

我需要一些关于从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个控制器,这些控制器将链接到我可以在整个应用程序中重用的部分视图,下拉列表包括标题,国家/地区,状态和其他人。

1 个答案:

答案 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" })

请注意,selectedtype将以您认为合适的方式确定,并且是可选的。

希望这会给你一些启发。