MVC下拉菜单的变量

时间:2014-01-27 19:47:08

标签: c# asp.net-mvc-4 lambda

我正在研究MVC4项目,我希望通过下拉菜单添加搜索,以便用户可以选择不同的变量进行搜索。

我的模特

 public class BloodStoredModel
{
    [Required]
    public int ID { get; set; }
    [Required]
    [DisplayName("Blood Type")]
    public string bloodType { get; set; }
    [Required]
    [DisplayName("RH Factor")]
    public string rhFactor { get; set; }
    [Required]
    [DisplayName("Last Name")]
    public string donorLastName { get; set; }
    [Required]
    [DisplayName("First Name")]
    public string donorFirstName { get; set; }
    [Required]
    [DisplayName("Address")]
    public string address { get; set; }
    [Required]
    [DisplayName("Phone #")]
    public string telephoneNumber { get; set; }

    public class BloodDBContext : DbContext
    {
        public DbSet<BloodStoredModel> BloodStored { get; set; }
    }
}

这是我的Controller方法

public ActionResult SearchIndex(string searchString)
    {
        //string searchString = id;
        var list = new SelectList(new[]
                                      {
                                          new{ID="1",Name="bloodType"},
                                          new{ID="2",Name="rhFactor"},
                                          new{ID="3",Name="donorLastName"},
                                          new{ID="4",Name="donorFirstName"},
                                          new{ID="5",Name="address"},
                                          new{ID="6",Name="telephoneNumber"}
                                      },
                        "ID", "Name", 1);
        ViewData["list"] = list;

        var bloodSearch = from m in db.BloodStored
                     select m;

        if (!String.IsNullOrEmpty(searchString))
        {
            //bloodSearch = bloodSearch.Where(s => s.donorLastName.Contains(searchString));
            bloodSearch = list.Select((value, index) => new { value, index })
                                     .Where(s => s.value.Contains(searchString))
                                     .Select(s => s.index);
        }

        return View(bloodSearch);
    }

注释的lambda表达式有效但仅适用于该特定变量。我想做的是通过下拉列表动态选择。

以下是我的相关观点

 @using (Html.BeginForm()){    
     <p> @Html.DropDownList("list", ViewData["list"] as SelectList)
     @Html.TextBox("SearchString")<br />  
     <input type="submit" value="Filter" /></p> 
    }

2 个答案:

答案 0 :(得分:0)

后端中值未发生变化的原因是您使用的是DropDownList而不是DropDownListFor。按下提交按钮后,DropDownListFor会自动将选择绑定到模型(执行POST)。您必须在ViewModel中包含下拉列表,或使用JavaScript / Jquery调整前端。

修改

您必须创建一个新类:

public DropDownOption
{
   public int Id {get; set;}
   public string Description {get; set;}
}

创建ViewModel

public myViewModel
{
   public List<DropDownOption> DropDownOptions {get; set;}
   public int OptionSelected {get; set;}
}

控制器:

{
//other stuff
var myVM = new myViewModel();
myVM.DropDownOptions = new List<DropDownOption>(){
   new DropDownOption{Id = 1, Name = "bloodType"},
   new DropDownOption{Id = 2, Name = "rhFactor"},
   //etc.
}

查看:

@model .myViewModel
//other stuff
@Html.DropDownListFor(m => m.OptionSelected,
   Model.DropDownOptions.Select(option => new SelectListItem
   {
      Text = option.Description,
      Value = option.Id
   })

答案 1 :(得分:0)

要使用用户选择的属性搜索BlookSearchModel数组,您需要使用反射。添加以下功能。

private string GetValue(BloodStoredModel obj, string propertyName)
{
    Type type = typeof(BloodStoredModel);
    if (type != null)
    {
        PropertyInfo property = type.GetProperty(propertyName);
        if (property != null)
        {
            return (string)property.GetValue(obj);
         }
    }

    return null;
}

你可以这样喜欢这个

bloodSearch = models.Where(s => string.Compare(GetValue(s, propertyName), searchString) == 0);

当然,通过硬编码属性名称可能会出错。您可以使用反射来枚举属性名称。

ViewBag.SearchFields = from prop in properties
                       select new SelectListItem() { Text = prop.Name };

这也会从您的模型中选择Id字段。但是,您可以修改linq语句以将其排除。

编辑我添加了以下内容。另外,我将上面的代码更改为使用ViewBag而不是ViewData。

要让您的视图使用此功能,您可以执行此操作。

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "form1" }))
{
    @Html.DropDownList("SearchFields")
 <input type="submit" value="submit" onclick="return SetAction();" />
}
<script>
    function SetAction() {
        form = document.getElementById("form1");
        dropdown = document.getElementById("SearchFields");

        form.action = "/" + "?searchString=" + dropdown.value;

        return true;
    }
</script>