在asp.net mvc 3中实现下拉列表

时间:2012-08-19 18:42:37

标签: asp.net-mvc-3 html.dropdownlistfor

我正在教自己asp .net mvc3。我已经研究了很多但是我读的越多,我变得越困惑。我想创建一个页面,用户可以在其中注册出售或出租物业。

我创建了一个如下所示的数据库:

public class Property
    {
        public int PropertyId { get; set; }
        public int PropertyType { get; set; }
        ···
        public int Furnished { get; set; }
        ...
}

现在,我想要dropdownlistfor = PropertyType和Furnished。

属性类型将是 1平 2楼 3独立式住宅 ...

家具将是: 1家具 2 UnFurnished 3 PartFurnished ...

现在,我真的不确定在我的代码中将这些信息保存在哪里。我的数据库中是否应该有2个存储此查找的表?或者我应该有一个包含所有查找的表吗?或者我应该将此信息保留在模型中吗?

模型如何在Property实体中绑定PropertyType和Furnished?

谢谢!

2 个答案:

答案 0 :(得分:2)

通过在数据库中存储属性类型和提供的类型,您可以使用外键强制数据完整性,而不是仅存储整数id,所以我肯定会建议这样做。

这也意味着如果您想添加新类型,它将来会有所证明。我知道价值观不会经常改变/永远不会改变,但如果您希望将来添加平房/豪宅,您不必重建和部署您的项目,您只需在数据库中添加一个新行。

就这将如何工作而言,我建议使用传递给视图的ViewModel,而不是直接传递数据库模型。这样您就可以将数据库模型与视图分开,并且视图只能看到它需要的内容。这也意味着您的下拉列表等是强类型的,并且直接在您的视图模型中,而不是仅仅被抛入ViewBag。您的视图模型可能如下所示:

public class PropertyViewModel
{
    public int PropertyId { get; set; }

    public int PropertyType { get; set; }
    public IEnumerable<SelectListItem> PropertyTypes { get; set; }

    public int Furnished { get; set; }
    public IEnumerable<SelectListItem> FurnishedTypes { get; set; }
}

那么你的控制器动作就像:

public class PropertiesController : Controller
{
    [HttpGet]
    public ViewResult Edit(int id)
    {
        Property property = db.Properties.Single(p => p.Id == id);

        PropertyViewModel viewModel = new PropertyViewModel
            {
                PropertyId = property.Id,
                PropertyType = property.PropertyType,
                PropertyTypes = from p in db.PropertyTypes
                                orderby p.TypeName
                                select new SelectListItem
                                    {
                                        Text = p.TypeName,
                                        Value = g.PropertyTypeId.ToString()
                                    }
                Furnished = property.Furnished,
                FurnishedTypes = from p in db.FurnishedTypes
                                orderby p.TypeName
                                select new SelectListItem
                                    {
                                        Text = p.TypeName,
                                        Value = g.FurnishedTypeId.ToString()
                                    }

            };

        return View();
    }

    [HttpGet]
    public ViewResult Edit(int id, PropertyViewModel propertyViewModel)
    {
        if(ModelState.IsValid)
        {
            // TODO: Store stuff in the database here
        }

        // TODO: Repopulate the view model drop lists here e.g.:
        propertyViewModel.FurnishedTypes = from p in db.FurnishedTypes
                                orderby p.TypeName
                                select new SelectListItem
                                    {
                                        Text = p.TypeName,
                                        Value = g.FurnishedTypeId.ToString()
                                    };

        return View(propertyViewModel);
    }
}

你的观点会有:

@Html.LabelFor(m => m.PropertyType)
@Html.DropDownListFor(m => m.PropertyType, Model.PropertyTypes)

答案 1 :(得分:0)

我通常通过在代码中使用枚举来处理这种情况:

public enum PropertyType {
    Flat = 1,
    House = 2,
    Detached House = 3
}

然后在你看来:

<select>
@foreach(var val in Enum.GetNames(typeof(PropertyType)){
    <option>val</option>
}
</select>

您可以将选项的ID设置为枚举中每个项目的值,并将其传递给控制器​​。

编辑:直接回答您的问题: 您可以将它们存储为数据库中的查找,但对于不太可能改变的东西,我通常只使用枚举,并保存往返。

另外看看这种方法,因为它看起来比我的好: Converting HTML.EditorFor into a drop down (html.dropdownfor?)