我正在使用 MVC 5 和 Entity Framework 6 创建一个 Web 应用程序,用户可以在其中提交报告并为其分配一个类别。一个报告可以有多个类别,一个类别可以有多个报告,因此是多对多关系。
public class Report
{
public int ReportID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
public class Category
{
public int CategoryID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Report> Reports { get; set; }
}
实体框架创建了桥表,但在构建视图以管理实体之间的关系方面不是很有帮助。
因此,对于编辑和创建视图,Report
我已经实现了本教程中的功能,以创建两个包含指定类别和可用类别的 MultiSelectList 框。使用一些javascript和控制器中的自定义代码将类别从一个列表移动到另一个列表,我更新了数据库。
这工作正常,但我真正想要的是拖放应用程序,用户可以在其中将Category
具有可用类别的侧边栏拖动Report
到分配它。
我安装了 JQuery Draggable 和 Droppable 插件,但后来发现了 HTML5 拖放功能。我找到了许多不错的教程,并设法在页面上获得了一些基本的拖放功能,但没有一个教程涉及更新底层数据库。现在我真的很难找到一种将分配的类别传回控制器的好方法,就像我对列表框所做的那样。
这是我到目前为止所拥有的:
// sidebar with available categories
<aside>
<label class="control-label">Available Categories</label>
<br/>
<ul class="AvailableCategories">
@foreach (var cat in ViewBag.availCats)
{
<li value="@cat.CategoryID" class="category">@cat.CategoryTitle</li>
}
</ul>
</aside>
// form group with selected categories
<div class="form-group">
@Html.LabelFor(model => model.Categories, "Categories", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<ul class="AssignedCategories" id="assignedCategories" style="width:500px;height:100px;border:1px solid black">
</ul>
</div>
</div>
// make the elements draggable/sortable
$(function () {
$('.AvailableCategories').sortable({
connectWith: '.AssignedCategories'
});
$('.AssignedCategories').sortable({
connectWith: '.AvailableCategories'
});
});
// old functionality with listboxes
<div class="form-group col-md-4">
<label class="control-label">Categories Assigned</label>
@Html.ListBox("selectedOptions", (MultiSelectList)ViewBag.selCats, new { @class = "form-control" })
</div>
// controller
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ReportID,Name,Description,CategoryID")] Report report, string[] selectedOptions, string[] assignedCategories)
{
// selectedOptions is populated from the old listboxes
// assignedCategories is always null
}
这可以将一个列表从一个列表拖放Category
到另一个列表,但是当Report
保存它时,我无法在 ReportController ActionResult 中捕获分配的类别并更新数据库。我创建了一个参数string[] assignedCategories
,希望它能够id="assignedCategories"
像对列表框那样绑定,但这个参数始终是null
.
Report.Categories
使用 MVC 和实体框架使用 HTML5 拖放功能填充集合和更新数据库的最佳方法是什么?任何帮助或指向一个好的教程的链接将不胜感激。
更新:
我没有为assignedCategories 使用正确的表单输入字段,模型绑定器正在寻找名称,而不是ID。这就是assignedCategories 为空的原因。因此,我创建了一个隐藏的输入字段,name="assignedCategories"
并且每次在分配的类别中删除类别时,我都会使用 javascript 更新值。现在我可以收集分配的 CategoryID 列表并在控制器中处理它。
尽管如此,必须有更好的方法来做到这一点。我可以使用哪种表单输入来删除分配的类别?