动态绑定和创建具有复杂数据库结构的项,以在MVC 3和EF4中使用viewModel创建和编辑视图
本文关键字:创建 EF4 viewModel 视图 编辑 MVC 复杂 数据库 结构 动态绑定 以在 | 更新日期: 2023-09-27 18:19:46
我在想办法解决这个问题时遇到了困难。任何帮助我们都将不胜感激。甚至还有一个适合我需求的更好结构的建议:在一个类别中构造类别项,并指定它们在类别项属性列表中的位置
除其他外,它还用于生成用于创建和编辑项目的表单。
长话短说:我需要知道我做得是否正确,或者在不破坏整个应用程序的情况下用更好的(可能是自动化的)方法来处理它。。
.
我在一台Win7 64位机器上使用VWD Express 2010中的MySQL 5,所有MySQL驱动程序都已安装(ODBC和.NET特定的提供程序,最后一个与ASP.NET 4不兼容)。这里出现了其他问题,但可能是另一个问题的目标:我正在编写我所有的模型,因为MySql与Linq-to-SQL不兼容(我可以想象为什么,但不确定)。。
.
返回真实主题:
我的型号是:
Category
-主实体,具有名称属性、CategoryItemProperty
实体集合和Item
实体集合CategoryItemProperty
-一个具有名称和一些其他属性的实体,这些属性决定了该类别中的Items
可能是什么(字段大小、掩码、输入限制等)Item
-属性基于类别属性的实体ItemProperty
-项目的属性(字段大小、掩码、输入限制等)
代码围绕着这个:
public class Category
{
public int CategoryId { get; set }
public string Description { get; set }
//...
public virtual List<CategoryItemProperty> ItemProperties { get; set; }
}
public class CategoryItemProperty
{
public int CategoryItemPropertyId { get; set; }
public string Label { get; set; }
public string Name { get; set; }
public int Size { get; set; }
public int MaxLenght { get; set; }
//...
public virtual Category Category { get; set; }
}
public class Item
{
public int ItemId { get; set; }
public string Description { get; set; }
public int CategoryId { get; set; }
//...
public virtual Category Category { get; set }
public virtual List<ItemProperty> Properties { get; set; }
}
public class ItemProperty
{
public int ItemPropertyId { get; set; }
public int ItemId { get; set; }
public int CategoryItemPropertyId { get; set; }
public string Value { get; set; }
//...
public virtual Item Item { get; set; }
public virtual CategoryItemProperty CategoryItemProperty { get; set; }
}
.
使用这种方法,最大的问题是生成表单并处理控制器端要保存到数据库的数据。
.
一个更详细的例子是:生成一个简单的联系表单:
我们创建了一个具有一些字段规范的Category
:
var category = new Category() { Description = "Simple Contact Form" };
MyEntitySet.Categories.Add(category);
MyEntitySet.SaveChanges();
//...
var name = new CategoryItemProperty() { Label = "Name", Size = 50, MaxLength = 50 };
var message = new CategoryItemProperty() { Label = "Message", Size = 50, MaxLength = 255 };
category.ItemProperties.Add(name);
category.ItemProperties.Add(message);
MyEntitySet.Entry(category).State = EntityState.Modified;
MyEntitySet.SaveChanges();
.
到目前为止,我所想到的是创建一个ViewModel
,将类别信息及其项属性集合传递给create和Edit视图,并在ItemProperties
中循环生成字段,在ItemController
中工作,接收FormCollection
,生成Item
及其ItemProperty
的对象,并将其保存到数据库中。但这个过程既可怕又痛苦:
项目/创建视图:
@model MyApp.Models.CategoryItemModelView
@Html.EditorFor(m => m.Description);
...
@foreach(var property in Model.ItemProperties)
{
<label>@property.Label</label>
<input type="text" name="@property.Name" size="@item.Size" maxlength="@item.MaxLength" />
}
在控制器中:
// GET: /Items/Create/5
public ActionResult Create(int id)
{
var categoryItemModelView = new CategoryItemModelView();
categoryItemModelView.Populate(id); // this method maps the category POCO to the ViewModel
return View(categoryItemModelView);
}
// POST: /Items/Create/5
[HttpPost]
public ActionResult Create(int id, FormCollection formData)
{
if (ModelState.IsValid)
{
var category = MyEntitySet.Categories.Find(id);
var item = new Item
{
CategoryId = id,
Description = formData["Description"],
// ...
Category = category
};
MyEntitySet.Items.Add(item);
foreach(var property in category.ItemProperties)
{
var itemProperty = new ItemProperty
{
ItemId = item.ItemId,
CategoryItemPropertyId = property.Id,
Value = form[property.Name],
// ...
Item = item,
CategoryItemProperty = property
};
MyEntitySet.ItemProperties.Add(itemProperty);
}
MyEntitySet.SaveChanges();
return RedirectToAction("Index");
}
// Here I don't know how to return the typed data to the user (the form returns empty)
var categoryItemModelView = new CategoryItemModelView(id);
categoryItemModelView.Populate(id); // this method maps the category POCO to the ViewModel
return View(categoryItemModelView);
}
.
我的问题出现在构建"创建"answers"编辑"操作及其各自的视图中(请参阅上面我现在的操作方式)当我必须使用Category.ItemProperties
生成字段并将信息存储在Item
对象中以及字段值存储在其ItemProperty
对象中时,如何处理这种情况
.
请注意:所有这些代码仅供示例使用。我的代码类似,但它由一个特定的控制器和CRUD Categories和CategoryItemProperties的特定视图处理,我对此没有问题。
.
抱歉发了这么长的短信。我尽量做到最清楚。如果你需要更多信息,请留言。
好的rcdmk!首先,我的英语很糟糕,我在这里只是想和大家分享我的一些经验。
我过去用MVVM(WPF)+EF4+T4构建过这样一个复杂的软件来生成POCO,我用Microsoft Blend来处理客户端和视图模型之间的操作、绑定等!
干得好!我希望我帮了你!
ps:我不知道Blend是否支持ASP.Net,但创建带有延迟加载的POCO(Viewmodel)可能会对你有所帮助!
据我所知,Category和相应的CategoryPropertyItems正在描述如何创建Item。Simply Category是绘制一个抽象表单,项和项属性是具体的(因为项属性具有Value属性)。所以在项目/创建操作(GET)中,您可以使用Category和CategoryPropertyItems构建项目及其属性。
公共项内部版本(类别类别){Item Item=new Item();项目Category=类别;项目项目Id=。。。
foreach(var categoryItemProperty in category.ItemProperties)
{
ItemProperty itemProperty = new ItemProperty();
itemProperty.Item = item;
itemProperty.CategoryItemProperty = categoryItemProperty;
itemProperty.ItemPropertyId = ...
}
return item;
}
作为索引/创建操作的结果,您可以只使用此Item对象,也可以将项放入ViewModel中。
在视图中,可以直接绑定到模型(项)属性。
这些链接可以帮助您。
使用ASP.NET MVC 2编辑和绑定嵌套列表模型绑定到列表