在我们的新产品中,我们有一些数据输入字段,要求您搜索要放在此字段中的正确值。
当您输入此数据输入字段时,我想通过视图上的某些内容(可能是Ajax实现)提供搜索选项,并允许它在数据库中搜索值,但是当结果返回时我想保留不受搜索影响的其他字段的现有值。
但我不知道如何用MVC做到这一点。有没有人对如何做到这一点有任何建议?
答案 0 :(得分:2)
将数据输入页面写入 ASP.NET MVC视图的常用方法。 没有Ajax就可以使用它 (例如,提交时正常工作 你只需键入值即可 自动完成)。
为用户执行特定操作时调用的JavaScript方法编写原型(例如,按某个控件内的键)。但这是在aspx页面的脚本标记内。不幸的是,堆栈溢出似乎在我的示例中“清理”脚本标记,所以我无法证明该部分。但是你的JavaScript原型看起来像这样:
function startAutoComplete() {
}
现在在用户界面控件上挂钩事件处理程序。您需要调用函数,为您的应用程序创建适当的事件处理程序原型。根据您的说明,您可能希望使用onkeydown,但有lots of events to choose from。您可能需要根据应用程序处理多个事件。
到目前为止,我们所做的一切都是标准的aspx和JavaScript。在这一步中,我们将完成整个过程的唯一部分,这对ASP.NET MVC来说是非常不同的。您需要向控制器添加一个动作,该动作将由您刚刚编写的JavaScript原型(间接)调用。该操作应该接受适当的输入(例如,表示来自控件的文本的字符串,或类似的,适合您的应用程序)并以JSON格式返回其结果。我将在这里展示一个非常简单的例子;随意在实际应用程序中替换更复杂的代码。
public ActionResult GetSuggestions(string searchText)
{
return Json(new {SearchText = searchText});
}
此示例仅返回包含一个属性的JavaScript对象,该属性包含传递给函数的值。就像你说的,你可以写一些对你的应用更有用的东西。
现在你需要在JavaScript中调用这个函数。 URI将类似于:
http://localhost/mycontroller/GetSuggestions?searchText=Foo
可以在没有JavaScript库的情况下进行Ajax调用,但如果使用jQuery或其他一些处理跨浏览器兼容性问题的库,则会更容易。因为我碰巧喜欢jQuery,所以我会证明这一点。让我们更新之前原型的startAutoComplete方法:
function startAutoComplete() {
var searchText = $("#myeditorid").text();
$.getJSON("/mycontroller/GetSuggestions?searchText=" + searchText,
null,
autoCompleteResponse);
}
第一行使用jQuery通过ID myeditorid获取控件中的文本。我们将它作为searchText参数传递给ASP.NET MVC操作,方法是将其作为查询字符串参数附加。
以$ .getJSON开头的下一行调用一个jQuery函数,该函数对您指定的URI进行Ajax调用。我们传递一个参数autoCompleteResponse,这是一个JavaScript方法的名称,如果Ajax调用的响应成功则调用它。现在我们必须编写autoCompleteResponse。
function autoCompleteResponse(data) {
if (data.SearchText)
{
$("#myeditorid").text(data.SearchText);
}
}
这说:“如果返回的数据具有SearchText属性,请将控件的文本设置为该值。”再次,使用返回的数据做适合您的应用程序的任何内容。