通过下面的设置,所有民族都会回发到服务器,我真的不关心整个列表,只关心选定的值。如何修改我的代码,以便只将选定的国籍与模型的其余部分一起发回?
型号:
// SearchCriteria model
public class SearchCriteria()
{
public SearchCriteria()
{
Nationalities = new List<SelectListItem>();
Nationalities.Add(new SelectListItem { Text = "Any Nationality", Value = "Any Nationality", Selected = true });
Nationalities.Add(new SelectListItem { Text = "United States", Value = "United States", Selected = false });
Nationalities.Add(new SelectListItem { Text = "Japanese", Value = "Japanese", Selected = false });
Nationalities.Add(new SelectListItem { Text = "Mexican", Value = "Mexican", Selected = false });
Nationalities.Add(new SelectListItem { Text = "Canadidan", Value = "Canadidan", Selected = false });
Nationalities.Add(new SelectListItem { Text = "Chinese", Value = "Chinese", Selected = false });
}
public string Name {get;set;}
public string Nationality { get; set; }
public List<SelectListItem> Nationalities { get; set; }
}
控制器:
[HttpPost]
public ActionResult Find(SearchCriteria model)
{
try
{
// find it
return View(model);
}
catch
{
return View(model);
}
}
查看:
@Html.Label("Name:");
@Html.TextBoxFor(model => model.Name);
@Html.Label("Nationality:");
@Html.DropDownListFor(model => model.Nationality, Model.Nationalities);
答案 0 :(得分:4)
我想我看到了你的问题。而且这本身并不是一个问题。这是你的一个误解。
国籍列表不会发回给您的控制器。每次创建SearchCriteria
对象时(包括模型绑定在帖子上时),它们都是由构造函数创建的。这不是客户端发布到服务器的。
虽然这是额外的工作,并不总是必要的,但这不是一个真正的问题。实际发布的值应该在SearchCriteria
对象的国籍成员中。
如果您不希望每次都创建Nationalities对象,那么您需要将其移动到辅助类并在想要填充此数据时调用它,或者将其完全移出您的类并在控制器。也许更好的选择是将这些数据移动到数据库中。
顺便说一句,您可能希望删除第一项并将其设为默认文本,这是DropDownList / DropDownListFor对象的参数。
答案 1 :(得分:2)
Nationalities
未被回发,它们只是在SearchCriteria
实例创建时填充。您可以在Chrome的开发人员控制台或Firefox中的firebug中看到服务器的海报。
答案 2 :(得分:-1)
尝试 NOT 将您的Nationalities
属性作为模型的实例成员。在其他类(例如帮助程序类)中将Nationalities
列表声明为类中的static
属性。 Nationalities
列表是一个参考数据,它不是很干净(在设计方面),它是实例模型的一部分。