我试图在一个简单的内容管理网站中执行crud操作。在尝试创建用于输入一段内容的CRUD视图时,有几个下拉列表需要填充,对于编辑操作,它们需要预先选择特定值。我一直在阅读一本关于它的教科书,并通过网络上的文章尽可能多地吸收这些信息,但我在确定哪里是属于这些下拉列表的信息的最佳位置上遇到了麻烦。我可以很容易地创建模型类来标识它们,然后我可以选择让数据一次填充一个,或者将此信息作为属性填充到我的内容模型类中,以便选择类的值,但可以直接绑定IEnumerable属性。
无论采用哪种方式,似乎都可以使用模板来创建下拉列表,但我正在尝试消除一些单独检索这些内容的“选择N+1”问题,但我也不想在我的模型中装满太多与MVC体系结构相比不属于那里的垃圾。
所以基本的问题是:下拉列表、过滤器等支持信息是否属于主要模型类中的子类,或者这些信息是否应该单独检索并作为单独的项呈现?或者,架构中还有其他应该使用的方面,而我只是完全错失了机会?
文章,链接,重定向都是受欢迎的。我已经用谷歌搜索过了,我所发现的要么没有回答这个问题,要么答案隐藏在大量的结果中。
发布于 2011-02-16 04:02:15
示例:图书和作者实体在视图中创建新图书时,您需要一个select控件,该控件将其选项填充为所有可用的作者。
Book模型应该是干净的,并且只包含相关字段,例如Title、Author
控制器应具有IAuthorRepository _authorRepository;字段,该字段可以由DependencyResolver设置,也可以在控制器构造函数中手动设置。IAuthorRepository会有一个像IEnumerable GetAvailableAuthors()这样的方法;
HttpGet Create()操作可以直接返回一个空的图书模型,然后将_authorRepository填充到动态ViewBag中。ViewBag.AuthorRepository = _authorRepository;
然后,视图将把ViewBag.AuthorRepository传递给局部视图或自定义编辑器。在这种情况下,您的模型将保持干净。
有些人不喜欢使用ViewBag.Xxx (或ViewData"Xxx"),因为它不够完美。我见过创建像BookViewModel这样的新类型的例子。然后,BookViewModel本身将包含Book和IAuthorRepository。然后,HttpGet Create()操作将返回一个BookViewModel对象,视图将通过向其传递model.AuthorRepository而不是ViewBag.AuthorRepository来呈现其作者选择局部视图。这开始看起来更像MVVM,而不是MVC。将任何这样的集合或存储库排除在实际模型(Book)之外的直觉是正确的。一个干净的模型是非常重要的,在任何模式中都会给你最大的灵活性。
发布于 2011-02-16 03:52:25
我不确定这是否是您想要的东西,但是我使用了我自己的类库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())如果做不到这一点,请看一下用于创建数据绑定CRUD视图的MVC Scaffolding。
发布于 2011-02-16 13:12:15
我同意Tion的回答,但我的回答无法在评论中表达出来。
首先,使用NHibernate的简单解决方案是:可以在多个集合上设置批处理,以便在一个查询中加载多个实体(而不是N!)。我们使用的批处理大小为100,具有非常显著的性能提升。如果您只是从一个表中加载所有内容,这将没有任何帮助。
现在是更棘手的,但仍然非常值得的解决方案。
如果你有经常被查询的相当静态的内容(下拉列表,帐户名查找等),你真的应该考虑把它缓存在内存中。如果您正在使用IOC,那么将CachingRepository实现替换为IRepsoitory<>是非常容易的。在我的公司,我们从FubuMVC那里借用了FubuCache,但我认为它只是一本字典。如果您有一个服务器场或多个服务器访问相同的数据,则可以使用Memcached来共享数据。
缓存的重要之处在于知道何时清除它。(例如,从数据库重新加载内容。)对我们来说这意味着
1)不管怎样,每隔5分钟(其他应用程序与数据库交互,因此我们需要获取它们的更改。2)任何时候插入或更新实体时,我们都会清除所有相关的缓存。
由于我们的大多数应用程序都是在具有许多连接的大型数据集上进行报告,因此我们几乎缓存了所有内容。只要您的服务器有足够的RAM,就不会有问题。
ps http://axisofeval.blogspot.com/2010/11/numbers-everybody-should-know.html
https://stackoverflow.com/questions/5008000
复制相似问题