如果没有FormMethod.Post,请在Dropdownlist中获取SelectedItem

时间:2017-05-03 12:47:51

标签: asp.net-mvc-4 html.dropdownlistfor html.actionlink

我有一个下拉列表,它绑定到我的模型中的列表。 Model.list_IDs

当前页面是"编辑"用户通过使用下拉列表固有地更改模型属性的页面。

@Html.DropDownListFor(model => Model.ID, Model.list_IDs, new { style = "width:250px" })

下拉列表中的项目不直观,所以我想提供一个按钮,单击该按钮后,通过存储过程检索其他信息(通过名为GetDetails的方法从控制器调用)

该按钮是通过动作链接创建的,我计划显示一个部分视图(如一个聚焦的弹出窗口),一旦点击该按钮就会显示附加信息。

@Html.ActionLink(" ", "GetDetails", new { id = Model.ID.ToString() }, new { @class = "lnkMagnify16", title = "View Details" })

显然Model.ID.ToString()不正确,因为它只会发送模型的当前ID,而不是下拉列表中当前选择的ID。

如何更改Model.ID.ToString()以代表下拉列表的当前所选项目?

我知道有一种方法可以使用FormMethod.Post(Get selected item in DropDownList ASP.NET MVC)来完成此操作,但我不想使用提交按钮重新加载页面。我也想避免"第三方"如果可能的话,像JavaScript这样的方法。

1 个答案:

答案 0 :(得分:1)

JavaScript不是第三方"方法,它也是唯一的方式来完成你想要的东西。无论是通过标准表单发布还是通过AJAX(JavaScript),您必须向服务器发出新请求以获取所需的新信息。

现在,由于你所有的特别关注是一种动态更新链接中Model.ID值的方法,你可以在没有AJAX或表单帖子的情况下做到这一点,但你仍然必须使用JavaScript,因为客户端的所有动态行为都源自JavaScript。基本上,您需要绑定到下拉列表的更改事件并更改链接的href属性。

document.getElementById('ID').addEventListener('change', function () {
    var selectedId = this.options[this.selectedIndex].value;
    document.getElementById('AwesomeLink').href = // alter `href` with `selectedId`
});

但是,如果用户点击该链接,该链接仍会改变整个视图。如果你真的希望用户留在页面上,那么你需要使用AJAX获取该链接的响应,然后以某种方式将其添加到页面中,无论是直接还是通过模式弹出(这将是需要甚至进一步的JavaScript来实现)。此外,还不清楚Model.ID值如何在URL中结束,即它是否是路径的一部分(/some/url/{id}/)或查询字符串参数({{ 1}})。如果它是前者,我建议切换到后者,因为这样可以更容易地构建您的URL客户端。

/some/url/?id={id}