2017-05-03 88 views
0

我有一个绑定到我的模型中的列表的下拉列表。 Model.list_IDs在没有FormMethod.Post的Dropdownlist中获取SelectedItem

当前页面是一个“编辑”页面,用户可以使用下拉列表固有地更改模型的属性。

@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

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

现在,由于您只是在动态更新链接中的Model.ID值,所以您可以在没有AJAX或表单发布的情况下执行此操作,但您仍然必须使用JavaScript,因为所有动态行为客户端-side来自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}/)还是作为查询字符串参数(/some/url/?id={id})。如果它是前者,我建议切换到后者,因为这会使构建URL客户端变得更容易。

var xhr = new XMLHttpRequest(); 
xhr.addEventListener("load", function (response) { 
    // add response.responseText to the DOM 
}); 
xhr.open("GET", "/some/url/?id=" + selectedId); 
xhr.send(); 
+0

感谢您的详细回复。但是,我没有试图动态更新Model.ID值。可以这样想:作为用户,您希望在下拉列表中看到您当前选择的ID的详细信息,但尚未影响模型ID。我已经有了更新模型的代码。我只是试图获取用户在下拉列表中选择的项目的数据,以便他们可以确保自己是他们选择的正确ID。 单击激活GetDetails的链接只是向用户显示更多关于他们将要在模型中更改的ID的信息。 – blacksaibot

+1

这就是*正是你想要做的。您需要选择的ID *,因为用户选择它*。这意味着它发生在客户端,所以你只能得到客户端的信息。这意味着使用JavaScript。没有其他办法。 –

+0

哦,好的。我现在明白了。谢谢。 – blacksaibot