动态绑定和创建具有复杂数据库结构的项,以在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的特定视图处理,我对此没有问题。


.

抱歉发了这么长的短信。我尽量做到最清楚。如果你需要更多信息,请留言。

动态绑定和创建具有复杂数据库结构的项,以在MVC 3和EF4中使用viewModel创建和编辑视图

好的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编辑和绑定嵌套列表模型绑定到列表