1

我正在自学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 Flat 2 House 3 Detached House ...

带家具的将是:1 带家具 2 不带家具 3 带家具...

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

模型将如何绑定到 Property 实体中的 PropertyType 和 Furnished?

谢谢!

4

2 回答 2

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)
于 2012-08-20T14:44:25.047 回答
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?)

于 2012-08-19T18:50:10.060 回答