如何在SelectListItem中存储2个以上的值

时间:2014-06-23 23:24:16

标签: asp.net asp.net-mvc entity-framework asp.net-mvc-5

我正在处理两个存储IP地址的不同数据库,因此我填充了一个下拉列表,其中显示了来自两个数据库的IP地址,如下所示: -

public JsonResult LoadRelatedIPs(string searchterm, string Searchby)
        {

            var ITsysips = repository.getTechnologyIPs(searchterm, Searchby).Select(a => a.IPAddress).ToList();


            var it360ips = repository.getIT360TechnologyIPs(searchterm, Searchby).Select(a => a.IPADDRESS).ToList();

            var join = ITsysips.Union(it360ips).ToList();
            var CSData = join.Select(m => new SelectListItem()
            {
                Text = m,
                Value = m,

            });

            return Json(CSData.OrderBy(a => a.Text), JsonRequestBehavior.AllowGet);


        }

但我遇到的问题是,当我将值发回给我的控制器时,我无法确定IP的位置,为此我需要查询两个数据库以了解IP地址的来源,我的模型如下: -

 public partial class ITsysSwitchPort
    {
        public int TechnologyID { get; set; }
        public int SwitchID { get; set; }
        public string PortNumber { get; set; }
        public Nullable<int> ITsysTechnologyIPID { get; set; }
        public Nullable<long> IT360NetworkID { get; set; }

        public virtual Technology Technology { get; set; }
        public virtual TechnologyIP TechnologyIP { get; set; }
        public virtual ITsysSwitch ITsysSwitch { get; set; }


  }

ITsysTechnologyIPID&amp; IT360NetworkID存储来自2个数据库的IP地址的ID。(当然对于某些记录,其中一个值将为null) 所以我的问题是我可以在我的SelectListitem中传递额外的值,包含ITsysTechnologyIPID&amp; IT360NetworkID?这样我就不需要查询数据库来重新检查ip位置了吗? 目前在我的视图中使用名为generalIP的字段显示IP地址下拉列表,如下所示:使用jQuery在运行时填充: -

 <span class="f">Site @Html.DisplayNameFor(model=>model.GeneralIP)</span>
        @Html.DropDownListFor(model => model.GeneralIP, Enumerable.Empty<SelectListItem>())
  @Html.ValidationMessageFor(model => model.GeneralIP) 

由于

3 个答案:

答案 0 :(得分:2)

<option>元素具有以下语法:

<option value="value-of-option"
        label="display-text-of-option"
>
  option-content
</option>

该选项的显示文字是<option>元素的内容或其label属性的值。 label属性优先于内容使用。

如果不存在value属性,则选项的(随表单提交的内容)是显示文本。如果存在value属性,则使用表单提交其值。

您可以将任意内容放入value属性中:如果您想将整个对象实例的序列化和加密表示编码为value的{​​{1}},则可以[理论上]这样做。

当表单提交给服务器时,该值的含义和解释完全取决于接收应用程序。

所以,是的,你可以做你所要求的。您可能想要考虑将内部数据发送到客户端的安全隐患。可能会建议加密选项值,以防止用户代理弄乱它。

答案 1 :(得分:1)

一种方法是将字符串加入Value,以便拥有ID和IP。

e.g。 id+"-"+IP

然后当您发布到控制器时,从-拆分字符串,您将拥有ID和IP地址。

但正如Nicholas Carey所说,SelectListItem = <option>只能有文字&amp;值。

答案 2 :(得分:1)

如何用源前缀“标记”数据(选项的值)?

var CSData = join.Select(m => new SelectListItem()
{
    Text = m,
    Value = String.Format("{0}_{1}", ITsysips.Contains(m) ? "SysIPs" : "360IPs" ,m),
});

然后,当使用选项中的选定值时,您可以检查:

if(valueFromOption.StartsWith("SysIPs"))
{
// it is from getTechnologyIPs method
}
else
{
// etc...
}