C# 在动态创建的Html.AutoCompleteFor中使用typeahead mvc模型

C# 在动态创建的Html.AutoCompleteFor中使用typeahead mvc模型,c#,asp.net-mvc,typeahead.js,C#,Asp.net Mvc,Typeahead.js,我用的是timdwilson的打字机。不幸的是,当我将AutoCompleteFor框放入for循环时遇到了一个问题,因为lambda表达式不能很好地处理autocompletefhelpers类(尤其是表达式计算器) 从本质上说,我得到的不是model=>model.SelectedIngredients[i]i得到model=>model.SelectedIngredients.get\u项(值(ASP.\u页面视图\u食谱\u创建\u cshtml+c\u显示类3\u 0).i) C#是否

我用的是timdwilson的打字机。不幸的是,当我将
AutoCompleteFor
框放入for循环时遇到了一个问题,因为lambda表达式不能很好地处理
autocompletefhelpers
类(尤其是
表达式
计算器)

从本质上说,我得到的不是
model=>model.SelectedIngredients[i]
i得到
model=>model.SelectedIngredients.get\u项(值(ASP.\u页面视图\u食谱\u创建\u cshtml+c\u显示类3\u 0).i)

C#是否仍然可以计算
所选的增量。获取项目(值(ASP.\u页面\u视图\u食谱\u创建\u cshtml+C#u显示类3\u 0)。我
只是
所选增量[i]


如果我没有说清楚,这里有一些屏幕截图

在这里它可以正常工作,因为
model=>model.testInt
已经(?)被评估或引用了


但是,当我尝试使用迭代器时,会出现以下情况。


我是timdwilson,我创建了Twitter.Typeahead.MVC.Model NuGet包和Typeahead MVC Model GitHub存储库,您遇到了问题。在查看您的问题后,我发现,实际上,
自动完成为输入元素的
数据自动完成id字段
属性生成的HTML应该已被
selectedgreedients\u 0\u
但被
selectedgreedients.get\u项目(值(ASP.\u页面\u视图\u食谱\u创建\u cshtml+c\u显示类3\u 0).i)

换言之,您期望的是:


但是,我们得到的却是:


由于
数据自动完成id字段
用于在页面上查找此元素并设置其值,因此在选择typeahead值时,不会捕获所选id

我通过正确生成HTML修复了此问题,与生成
valueExpression
的方式相同。此修复将出现在中,并且已签入到中

若要在本地副本中修复此问题,请将Controllers\HtmlHelpers文件夹(或移动到的任何位置)中的AutocompleteHelpers类替换为以下代码:

公共静态类HtmlHelpers{
/// 
///扩展MvcHtml以有条件地显示值或空字符串
/// 
///如果“评估”为真,则显示的值
/// 
/// 
公共静态MvcHtmlString If(此MvcHtmlString值,布尔求值){
返回评估值:MvcHtmlString.Empty;
}
/// 
///扩展MvcHtml以有条件地显示两个可能的值之一
/// 
///如果“评估”为真,则显示的值
/// 
///如果“评估”为false,则显示的值
/// 
公共静态MvcHtmlString If(此MvcHtmlString值、bool求值、MvcHtmlString值iffalse){
返回评估?值:valueIfFalse;
}
}
公共静态类自动完成帮助程序
{
public static MvcHtmlString AutocompleteFor(此HtmlHelper html,表达式值表达式,
表达式idExpression、字符串actionName、字符串controllerName、bool requestFocus)
{
返回CreateTextBoxForFromAutocompleteFor(html、valueExpression、actionName、controllerName、requestFocus、,
idExpression.Body.ToString());
}
public static MvcHtmlString AutocompleteFor(此HtmlHelper html,表达式值表达式,
表达式idExpression、int索引、字符串actionName、字符串controllerName、bool requestFocus)
{
//获取自动完成id字段的完全限定类名
字符串idFieldString=idExpression.Body.ToString();
//如果id字段是数组,则为句柄
int loc_get_Item=idFieldString.IndexOf(“.get_Item”);
如果(loc_get_项目>0)
{
idFieldString=idFieldString.子字符串(0,loc_get_项);
idFieldString+=string.Format(“{0}”,索引);
}
var textBoxFor=createtextboxforfromfromautocompletefor(html、valueExpression、actionName、controllerName、requestFocus、idFieldString);
返回textBoxFor;
}
私有静态MvcHtmlString CreateTextBoxForFromAutocompleteFor(HtmlHelper html,
表达式值表达式、字符串操作名、字符串控制器名、布尔请求焦点、字符串idFieldString)
{
字符串autocompleteUrl=UrlHelper.GenerateUrl(null,actionName,controllerName,
无效的
html.RouteCollection,
html.ViewContext.RequestContext,
includeImplicitMVC值:true);
string@class=“form control typeahead”+(requestFocus?“focus”:string.Empty);
//我们需要从一开始就剥离“模型”
int loc=idFieldString.IndexOf('.');
//另外,将.with替换为u,因为这是由MVC完成的,因此字段名是js友好的
字符串autocompletedField=idFieldString.Substring(loc+1,idFieldString.Length-loc-1)。替换('.',''.');
var textBoxFor=html.textBoxFor(valueExpression,
新的{data\u autocomplete\u url=autocompleteUrl,@class,data\u autocomplete\u id\u field=autocompletedfield});
返回textBoxFor;
}
}

如果此修复对您有效,请接受此作为您问题的答案。如果您有任何其他问题或困难,请告诉我。谢谢Rory!

当对嵌套属性进行解除绑定时,会发生类似情况:
我在github上为其创建了一个问题