MVC5 EF6
我已经启动了一个MVC应用程序,一切顺利 - 创建/编辑/删除视图都运行良好。
我已达到"标准" @ Html.TextBoxFor / @ Html.EditorFor等确实做了我需要的事。
我正在创建具有类别的产品。大约有10个父类别,每个可以有多个孩子,每个孩子可以有多个孩子等等,所以标准控件不能提供良好的用户体验 - 脚手架代码有一个组合框。
我已经实施了一个模式,可以显示&#34;树视图中的所有类别&#34; - 它实际上是嵌套的<ul></ul>
。例如http://jsfiddle.net/umutc1/eyf9q87c/但是每个treenode都有一个按钮,动态生成树:
@helper TreeView(ICollection<Heisenberg.Models.Category> categoryTree)
{
foreach (var item in categoryTree)
{
<li>
@if (item.Category1.Count > 0)
{
@Html.ActionLink(@item.CategoryID.ToString(), "SelectCategory", new { id = @item.CategoryID })
<ul>
@TreeView(item.Category1)
</ul>
}
else
{
@Html.ActionLink(@item.CategoryID.ToString(), "SelectCategory", new { id = @item.CategoryID })
}
</li>
}
}
到目前为止一切顺利。我遇到的问题,并且因为我是MVC新手而无法解决问题 - 如何进行编码,以便当用户点击按钮时,模型会更新为包含CategoryID。
正如你所看到的,我没有使用标准按钮,而是使用了ActionLink,在我的控制器中我有这个:
public ActionResult SelectCategory([Bind(Include = "ProdID,CategoryID")] Product product, int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Category category = db.Categories.Find(id);
if (category == null)
{
return HttpNotFound();
}
product.CategoryID = id.GetValueOrDefault();
return View(product);
}
这显然不起作用。 classID通过ok但return View(product);
错误 - 它试图将我发送到http://localhost:61217/Products/SelectCategory/163并且没有退出,我只想返回产品创建页面包含我刚刚选择的CategoryID的产品型号。
我是否在相应的asp按钮点击事件的正确轨道上?或者我应该这样做完全不同吗?
答案 0 :(得分:0)
感谢@StephenMuecke,我设法解决了这个问题。
这就是我的所作所为: 在我的创建页面上,我有一个用于CategoryID的HiddenField
@Html.HiddenFor(model => model.CategoryID, new { @class = "form-control", @id = "tbCategoryID" })
和一个文本框,一旦选择了类别名称 - 这不是必需的,但对于用户反馈他们实际上选择了一个类别是好的:
@Html.TextBox("CategoryName", null, new { @class = "form-control", @id = "tbCategoryName", @readonly = "readonly" })
我的treeview /嵌套<li>
的每个节点都有<span>
类category
以及data-id和data-categoryname属性来存储这些详细信息以供日后使用。
<span class="leaf closemodal category" data-id="@item.CategoryID" data-categoryname="@item.CategoryName"> @item.CategoryName</span>
然后我使用Javascript为这些<span>
添加了一个onclick函数:
$('span.category').click(function () {
var id = $(this).data('id');
var name = $(this).data('categoryname');
$('#tbCategoryID').val(id);
$('#tbCategoryName').val(name);
});
添加此点击功能意味着当用户点击其中一个<span>
时,它会从范围的data-XXX
属性中获取ID和名称。然后,该函数将ID和NAME添加到适当的字段 - HiddenField和textBox。
表单提交后,类别ID将发回给Controller。