我正在研究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>
}
答案 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>