- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 VS 2013 开发 ASP.NET MVC 5、EF 6、Razor 引擎、VB 语言和数据库优先方法。
现在,在我的数据库中;我有两个表如下:
CREATE TABLE [dbo].[Group]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
[Name] VARCHAR(50) NOT NULL
)
和
CREATE TABLE [dbo].[Subscriber]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
[FirstName] [nvarchar](100) NOT NULL,
[MiddleName] [nvarchar](100) NULL,
[LastName] [nvarchar](100) NOT NULL,
[Email] [varchar] (200) NOT NULL UNIQUE,
[GroupId] INT NULL REFERENCES [Group] ON DELETE SET NULL
)
现在,当我使用脚手架自动生成 Controller 和 View 时;我在“创建订阅者”和“编辑订阅者” View 中获得一个 ,其中所有 Subscriber
项目均为
我如何自动生成/实现它?
最佳答案
不要过分依赖脚手架。重点是它为你提供了一个工作基础;这并不是您的观点的全部。您可以而且应该修改脚手架以满足您的需求,老实说,通常情况下,从头开始比尝试消除脚手架添加的所有不必要的内容更容易。
也就是说,特别是在一次选择多个相关项目时,您需要一个 View 模型。尝试使用你的实体来做这件事很快就会失去动力。因此创建一个类,例如:
public class GroupViewModel
{
// `Group` properties you need to edit here
public List<int> SelectedSubscriberIds { get; set; }
public IEnumerable<SelectListItem> SubscriberChoices { get; set; }
}
然后,在您的 Controller 中:
// We'll use this code multiple times so it's factored out into it's own method
private void PopulateSubscriberChoices(GroupViewModel model)
{
model.SubscriberChoices = db.Subscribers.Select(m => new SelectListItem
{
Value = m.Id.ToString(),
Text = m.FirstName + " " + m.LastName
});
}
public ActionResult Create()
{
var model = new GroupViewModel();
PopulateSubscriberChoices(model);
return View(model);
}
[HttpPost]
public ActionResult Create(GroupViewModel model)
{
if (ModelState.IsValid)
{
// Map the posted values onto a new `Group` instance. To set `Subscribers`,
// lookup instances from the database using the list of ids the user chose
var group = new Group
{
Name = model.Name,
Subscribers = db.Subscribers.Where(m => model.SelectedSubscriberIds.Contains(m.Id))
};
db.Groups.Add(group);
db.SaveChanges()
return RedirectToAction("Index");
}
PopulateSubscriberChoices(model);
return View(model);
}
public ActionResult Edit(int id)
{
var group = db.Groups.Find(id);
if (group == null)
{
return new HttpNotFoundResult();
}
// Map `Group` properties to your view model
var model = new GroupViewModel
{
Name = group.Name,
SelectedSubscriberIds = group.Subscribers.Select(m => m.Id).ToList()
};
PopulateSubscriberChoices(model);
return View(model);
}
[HttpPost]
public ActionResult Edit(int id, GroupViewModel model)
{
var group = db.Groups.Find(id);
if (group == null)
{
return new HttpNotFoundResult();
}
if (ModelState.IsValid)
{
group.Name = model.Name;
// Little bit trickier here
// First remove subscribers that are no longer selected
group.Subscribers.Where(m => !model.SelectedSubscriberIds.Contains(m.Id))
.ToList().ForEach(m => group.Subscribers.Remove(m));
// Now add newly selected subscribers
var existingSubscriberIds = group.Subscribers.Select(m => m.Id);
var newSubscriberIds = model.SelectedSubscriberIds.Except(existingSubscriberIds);
db.Subscribers.Where(m => newSubscriberIds.Contains(m.Id))
.ToList().ForEach(m => group.Subscribers.Add(m));
db.Entry(group).State = EntityState.Modified;
db.SaveChanges()
return RedirectToAction("Index");
}
PopulateSubscriberChoices(model);
return View(model);
}
编辑帖子操作是最困难的。为了不出现有关重复键等的错误,您需要确保不向集合中添加重复的项目。您还需要确保删除该组与用户未选择的任何项目之间的关系。除此之外,它非常简单。
最后在您的 View 中,您只需要渲染选择列表:
@model Namespace.To.GroupViewModel
...
@Html.ListBoxFor(m => m.SelectedSubscriberIds, Model.SubscriberChoices)
更新
添加转换后的 VB 代码。这可能无法 100% 开箱即用。具有更多 VB 经验的任何人都可以随意编辑此内容以纠正任何问题。
查看模型
Public Class GroupViewModel
' Group properties you need to edit here
Public Property SelectedSubscriberIds As List(Of Integer)
Public Property SubscriberChoices As IEnumerable(Of SelectListItem)
End Class
Controller 代码
' We'll use this code multiple times so it's factored out into it's own method
Private Sub PopulateSubscriberChoices(model As GroupViewModel)
model.SubscriberChoices = db.Subscribers.[Select](Function(m) New SelectListItem With { _
.Value = m.Id, _
.Text = m.FirstName & " " & m.LastName _
})
End Sub
Public Function Create() As ActionResult
Dim model as New GroupViewModel
PopulateSubscriberChoices(model)
Return View(model)
End Function
<HttpPost> _
Public Function Create(model As GroupViewModel) As ActionResult
If ModelState.IsValid Then
' Map the posted values onto a new `Group` instance. To set `Subscribers`,
' lookup instances from the database using the list of ids the user chose
Dim group = New Group With { _
.Name = model.Name, _
.Subscribers = db.Subscribers.Where(Function(m) model.SelectedSubscriberIds.Contains(m.Id)) _
}
db.Groups.Add(group)
db.SaveChanges()
Return RedirectToAction("Index")
End If
PopulateSubscriberChoices(model)
Return View(model)
End Function
Public Function Edit(id As Integer) As ActionResult
Dim group = db.Groups.Find(id)
If group Is Nothing Then
Return New HttpNotFoundResult()
End If
' Map `Group` properties to your view model
Dim model = New GroupViewModel With { _
.Name = group.Name, _
.SelectedSubscriberIds = group.Subscribers.[Select](Function(m) m.Id).ToList _
}
PopulateSubscriberChoices(model)
Return View(model)
End Function
<HttpPost> _
Public Function Edit(id As Integer, model As GroupViewModel) As ActionResult
Dim group = db.Groups.Find(id)
If group Is Nothing Then
Return New HttpNotFoundResult()
End If
If ModelState.IsValid Then
group.Name = model.Name
' Little bit trickier here
' First remove subscribers that are no longer selected
group.Subscribers.Where(Function(m) Not model.SelectedSubscriberIds.Contains(m.Id)).ToList().ForEach(Function(m) group.Subscribers.Remove(m))
' Now add newly selected subscribers
Dim existingSubscriberIds = group.Subscribers.[Select](Function(m) m.Id)
Dim newSubscriberIds = model.SelectedSubscriberIds.Except(existingSubscriberIds)
db.Subscribers.Where(Function(m) newSubscriberIds.Contains(m.Id)).ToList().ForEach(Function(m) group.Subscribers.Add(m))
db.Entry(group).State = EntityState.Modified
db.SaveChanges()
Return RedirectToAction("Index")
End If
PopulateSubscriberChoices(model)
Return View(model)
End Function
关于asp.net-mvc - ASP.NET MVC 5 - 多对一关系的脚手架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27381766/
我有一个 ProductDescription ViewController,它从我放置在许多 ViewController 中的 ProductTable UITableView 调用。 对于 St
首先,是的,我使用的是 DistinctRootEntityResultTransformer。 我有以下(Fluent NHibernate)映射: public FirstObjectMap()
我有两个模型:Book 和 Author。每个Author有很多本书,每本书有很多作者,所以我在Author和Book之间建立了ManyToMany关系,如下所示: class Author(mode
我正在尝试映射两个具有一对一关系的类之间的关系。在互联网上查找后,似乎人们更喜欢使用多对一来映射它。 例如,有一个 Order 类和 Bill 类。比尔持有发票的 FK。 这是我为比尔绘制的 map
假设有以下实体类: public class Player { public virtual int ID { get; set; } public virtual string Name { g
我想尝试一下 dynamodb 我能够保存单个对象。现在我想尝试创建一个多对一的关联。 许多任务应附加到单个用户。 @DynamoDBTable(tableName = "User") public
所以,情况如下: 表ComputerInventory,其中包含{computerInventoryID(主键)、TagID(唯一)、名称等} 表reviewStatus,其中包含{reviewSta
我在使用 hibernate 进行多对一映射时遇到问题。我有两个表,表 A 和表 B。我在这些表之间映射了多对一关系。两个表可以一起使用,也可以单独使用。 用 Java 中的类来表示表,例如: cla
我的实体: @Entity public class Film { @Id @GeneratedValue(strategy = IDENTITY) private long film
我必须制作拼贴项目的域层。我们的标准很少,比如我们必须使用 Hibernate,而且数据库也是固定的。 数据库的相关部分看起来几乎像这样: BusEntity(表 1) 总线 ID 公交车具体信息 总
如果有这两个实体: @Entity @Table(name = "CUSTOMER") public class Customer { @Id @GeneratedValue(stra
我正在尝试找出在多对一关系中检索单个最新结果的最有效方法。 示例: 实体 A - 团队(名称)实体 B - 员工(姓名,已创建) 团队>员工 我想在 Employee 上创建一个获取请求,返回每个团队
假设我有一个MySQL表read,记录了一个userid和一个articleid,记录了用户阅读了哪些文章。我现在想列出已阅读文章 1、2 和 3 的用户。 我知道以下是不可能的,但它说明了这个想法:
我的两个实体之间存在多对一关系。现在我希望当没有更多的 child 时将 parent 移除。 我的情况: 类(class)联系人 类(class)组织 一个组织有几个联系人,每个联系人都有一个组织。
我有下表: A 和 B A 有一个复合 PK:id int,类型 string。 B 只有 A 的 PK 之一:id int。 如何使用 B 的 id 和常量 type='typeB' 定义从 A 到
我正在为我的项目使用 Hibernate 3 映射一些实体,并简单地解释说我有这样的东西: Student 实体(tstudent 表) UniversityStudent 实体(tuniversit
我有一个成员表:成员(id, name, gender, head_id) 我想要的是建立以户主(家庭成员)为基础的家庭关系。就像这样:一个成员属于一个家庭(由成员定义) 也许我可以将其拆分为 2 个
示例 父类 @OneToMany(mappedBy = "parent") private List childs; 子类 @ManyToOne(cascade = CascadeType.ALL)
我有以下化学过程数据集,由 5 个连续输入向量组成,产生 1 个输出。每个输入每分钟采样一次,而输出操作系统每 5 采样一次。 虽然我相信输出取决于之前的 5 个输入向量,但我决定为我的设计寻找 LS
我正在将我的应用程序从原则 1 转换为原则 2.4我确实从数据库自动映射,但缺少一些关系: 表:产品产品 ID、标题、价格 表:位置产品id , 产品id , 位置id , 数量 因此每个 Locat
我是一名优秀的程序员,十分优秀!