CRUD的首选型号配置是什么?

时间:2011-02-15 18:40:07

标签: c# asp.net-mvc-3 razor crud

我正在尝试在简单的内容管理网站中执行crud操作。在尝试为输入内容创建我的CRUD视图时,需要填充几个下拉菜单,并且在编辑操作的情况下,他们需要预先选择特定值。我一直在阅读一本关于它的教科书,并尽可能多地通过网络上的文章吸收,但我很难确定哪些地方最适合这些下拉菜单的信息。我可以轻松地创建模型类来识别它们,然后我可以选择让数据一次填充一个,或者将这些信息填充为我的内容模型类中的属性,以便选择类的值,但IEnumerable属性可以直接绑定。

无论哪种方式似乎都可以使用模板来创建下拉菜单,但我试图消除一些单独检索这些内容的“选择N + 1”问题,但我也不想打包我的模型充满了太多的垃圾,真的不属于MVC体系结构。

所以基本的问题是:下拉菜单,过滤器等支持信息是否属于主要模型类中的子类,还是应该单独检索并单独显示为单独的项目?或者是否应该使用该架构的其他方面,我只是完全错过了这艘船?

文章,链接,重定向都受到欢迎。我用谷歌搜索了这个,我发现的要么没有回答这个问题,要么答案隐藏在大量的结果中。

3 个答案:

答案 0 :(得分:1)

示例:书籍和作者实体 在视图中创建新书时,您需要一个选择控件,其选项填充为所有可用作者。

Book模型应该是干净的,并且只包含相关字段,例如标题,作者

控制器应该有一个IAuthorRepository _authorRepository;可以由DependencyResolver设置的字段,也可以在控制器构造函数中手动设置。 IAuthorRepository将有一个方法,如IEnumerable GetAvailableAuthors();

[HttpGet] Create()动作可以直接返回一个空的Book模型,然后将_authorRepository填充到动态ViewBag中。 ViewBag.AuthorRepository = _authorRepository;

然后,视图会将ViewBag.AuthorRepository传递给局部视图或自定义编辑器。在这种情况下,您的模型保持清洁。

有些人不喜欢使用ViewBag.Xxx(或ViewData [“Xxx”]),因为它不是完美的MVC。我已经看过可以创建像BookViewModel这样的新类型的示例。然后,BookViewModel将包含Book和IAuthorRepository。然后,[HttpGet] Create()动作将返回一个BookViewModel对象,视图将通过传递model.AuthorRepository而不是ViewBag.AuthorRepository来呈现其Author Select局部视图。这种开始看起来更像MVVM而不是MVC。您将任何此类集合或存储库保留在实际模型(Book)之外的本能是正确的。干净的模型非常重要,可以为您提供任何模式的最大灵活性。

答案 1 :(得分:0)

不确定这是否是您所追求的东西,但我使用自己的名为Web.Shared的类库,它保存了我所有的帮助方法。我有一个SelectListHelper类,我用它来填充我的所有下拉列表。这样我的代码就可以从主域模型中分离出来,并且可以通过这个以及任何其他MVC应用程序重用,这是我解决方案的一部分。

// Return days of the month for a dropdownlist
public static class SelectListHelper
{
    public static SelectList DayList()
    {
        return NumberList(1, 31);
    }
}

// Use in view 
@Html.DropDownListFor(m => m.Day, SelectListHelper.DayList())

// Another one for selecting genders
public static SelectList GenderList(string selectedValue = null)
{
    IList<KeyValuePair<string, string>> genders = new List<KeyValuePair<string, string>>();
    genders.Insert(0, new KeyValuePair<string, string>("F", "Female"));
    genders.Insert(0, new KeyValuePair<string, string>("M", "Male"));
    genders.Insert(0, new KeyValuePair<string, string>("", "Choose Gender"));
    return new SelectList(genders, "Key", "Value", selectedValue);
}

// Use in my edit view
@Html.DropDownListFor(m => m.Gender, SelectListHelper.GenderList())

如果失败,请查看MVC Scaffolding以创建数据绑定的CRUD视图。

答案 2 :(得分:0)

我同意Tion的回答,但我的回答不符合评论。

首先,如果你正在使用NHibernate这个简单的解决方案:你可以在has-many集合上设置批处理来在一个查询中加载许多实体(而不是N!)。我们使用100的批量大小,性能显着提升。如果您只是从一个表中加载所有内容,这将无济于事。

现在是更棘手但仍然非常有价值的解决方案。

如果您经常查询相当静态的内容(下拉列表,帐户名称查找等),您应该考虑将其缓存在内存中。如果您正在使用IOC,则可以非常轻松地在IRepsoitory&lt;&gt;的CachingRepository实现中进行交换。在我的公司,我们从FubuMVC借用了FubuCache,但我认为它只是一个幕后的字典。如果您有一个服务器场或多个服务器访问相同的数据,您可以使用Memcached来共享数据。

缓存的重要一点是知道何时清除缓存。 (即,从数据库重新加载内容。)对我们来说,这意味着

1)无论如何每隔5分钟(其他应用程序与数据库交互,因此我们需要接收他们的更改。 2)每当插入或更新实体时,我们都会清除所有相关的缓存。

由于我们的大多数应用程序都报告了包含许多联接的大型数据集,因此几乎可以缓存所有内容。只要你的服务器有足够的内存,你就可以了。

ps http://axisofeval.blogspot.com/2010/11/numbers-everybody-should-know.html