MVC按钮单击事件的等效项

时间:2015-04-15 07:05:48

标签: asp.net-mvc asp.net-mvc-5

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按钮点击事件的正确轨道上?或者我应该这样做完全不同吗?

1 个答案:

答案 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。