如何仅从DropDownList发布所选值?

时间:2013-07-21 16:57:28

标签: c# asp.net-mvc

通过下面的设置,所有民族都会回发到服务器,我真的不关心整个列表,只关心选定的值。如何修改我的代码,以便只将选定的国籍与模型的其余部分一起发回?

型号:

    // 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);

3 个答案:

答案 0 :(得分:4)

我想我看到了你的问题。而且这本身并不是一个问题。这是你的一个误解。

国籍列表不会发回给您的控制器。每次创建SearchCriteria对象时(包括模型绑定在帖子上时),它们都是由构造函数创建的。这不是客户端发布到服务器的。

虽然这是额外的工作,并不总是必要的,但这不是一个真正的问题。实际发布的值应该在SearchCriteria对象的国籍成员中。

如果您不希望每次都创建Nationalities对象,那么您需要将其移动到辅助类并在想要填充此数据时调用它,或者将其完全移出您的类并在控制器。也许更好的选择是将这些数据移动到数据库中。

顺便说一句,您可能希望删除第一项并将其设为默认文本,这是DropDownList / DropDownListFor对象的参数。

答案 1 :(得分:2)

Nationalities未被回发,它们只是在SearchCriteria实例创建时填充。您可以在Chrome的开发人员控制台或Firefox中的firebug中看到服务器的海报。

答案 2 :(得分:-1)

尝试 NOT 将您的Nationalities属性作为模型的实例成员。在其他类(例如帮助程序类)中将Nationalities列表声明为类中的static属性。 Nationalities列表是一个参考数据,它不是很干净(在设计方面),它是实例模型的一部分。