假设你已经正确地映射了这个实体框架,并且你的游戏对象有一个平台集合,那么将现有的平台分配给一个游戏应该和把这些平台的ID传递给你的游戏添加/编辑动作一样简单。
在您的表单中,您可以使用一系列复选框,其中值属性为PlatformID,例如,一个通用名称“platformids”。注意,那个
Html.CheckBox()
HtmlHelper没有“value”的参数,因此必须通过htmlAttributes对象来指定它。MVC的默认模型绑定器将通过向接收操作添加匹配参数,自动将表单中的“platformid”值集合分组为单个类型的IEnumerable。
这里有一些代码可以让您开始:
// games controller
public action AddGame(Game newGame, int[] platformIds) {
Platforms[] platforms;
if(platFormIds != null && platformIds.Any()) {
platforms = ObjectContext.Platforms.Where(ExpressionExtensions.BuildOrExpression<Platform, int>(p => p.PlatformID, platformIds)).ToList();
}
if(ModelState.IsValid()) {
game.Platforms.AddRange(platforms);
ObjectContext.AddToGames(game);
ObjectContext.SaveChanges();
}
}
// helper class
public static Expression<Func<TElement, bool>> BuildOrExpression<TElement, TValue>(Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) {
if (valueSelector == null) throw new ArgumentNullException("valueSelector");
if (values == null) throw new ArgumentNullException("values");
ParameterExpression p = valueSelector.Parameters.Single();
if (!values.Any())
return e => false;
IEnumerable<Expression> equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
Expression body = equals.Aggregate(Expression.Or);
return Expression.Lambda<Func<TElement, bool>>(body, p);
}
注:在
BuildOrExpression()
上面是创建SQL等价物的一个很好的方法
SELECT * FROM TABLE WHERE ID IN(1,2,3,4,5,...)
.