- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建一个自动完成文本框,同时使用 EditorTemplate
。我面临的问题是,通过使用 Html.BeginCollectionItem()
扩展解决方案 ( https://www.nuget.org/packages/BeginCollectionItem/ ),EditorFor()
和 TextBoxFor( )
方法得到动态设置,这会破坏我的 javascript。除此之外,我什至不知道这是否可能(如果可能,如何实现。您将在下面找到我已经走了多远)。
在主视图中,我有一个循环来为集合中的每个项目生成局部 View
for (int i = 0; i < Model.VoedingCollection.Count; i++)
{
@Html.EditorFor(x => x.VoedingCollection[i], "CreateVoedingTemplate")
}
局部 View CreateVoedingTemplate.cshtml
使用Html.BeginCollectionItem()
方法
@using (Html.BeginCollectionItem("VoedingCollection"))
{
string uniqueId = ViewData.TemplateInfo.HtmlFieldPrefix.Replace('[', '_').Replace(']', '_').ToString();
string searchId = "Search_";
string standaardVoedingId = "StandaardVoeding_";
foreach (KeyValuePair<string, object> item in ViewData)
{
if (item.Key == "Count")
{
searchId = searchId + item.Value.ToString();
standaardVoedingId = standaardVoedingId + item.Value.ToString();
}
}
<div class="form-horizontal">
<div class="form-group" id=@standaardVoedingId>
@Html.LabelFor(model => model.fk_standaardVoedingId, "Voeding naam", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.HiddenFor(model => model.fk_standaardVoedingId)
<input type="text" id='@searchId' placeholder="Search for a product"/>
</div>
</div>
</div>
<script type="text/javascript">
var id = '@uniqueId' + '_fk_standaardVoedingId'.toString();
var search = '@searchId'.toString();
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "AgendaApi" })';
$(document.getElementById(search)).autocomplete({
source: function (request, response) {
$.ajax({
url: url,
data: { query: request.term },
dataType: 'json',
type: 'GET',
success: function (data) {
response($.map(data, function (item) {
return {
label: item.standaardVoedingNaam,
value: item.standaardVoedingId
}
}));
}
})
},
select: function (event, ui) {
$(document.getElementById(search)).val(ui.item.label);
//$('#id').val(ui.item.value);
document.getElementById(id).value = ui.item.value;
return false;
},
minLength: 1
});
</script>
}
<link href="~/Content/SearchBox/jquery-ui.css" rel="stylesheet" />
<script src="~/Scripts/SearchBox/jquery-1.9.1.js"></script>
<script src="~/Scripts/SearchBox/jquery-ui.js"></script>
在上面的脚本中,我试图创建一个函数,用户可以在其中输入 standaardVoeding
项的名称,然后在用户选择 standaardVoeding 后获取结果
项,standaardVoedingId
属性被设置。然后,在提交整个表单后, Controller 收到 standaardVoedingId
(以及所有其他信息)
所以我猜 Javascript 不知何故无法处理 Razor View @
代码,紧接着,Html.BeginCollectionItem
做了一些可疑的事情,因为您无法设置其文本框的值在运行时通过代码。接下来,我尝试执行 alert(document.getElementById(*html.begincollectionitemId*))
并发现字段正常。但显然所有其他方法都不起作用?
是否有更好的解决方案来让它发挥作用?
最佳答案
BeginCollectionItem()
方法改变了内置助手生成的 html 的 id
和 name
属性,在您的例子中,隐藏输入,而不是
<input ... name="fk_standaardVoedingId" .... />
它会生成
<input ... name="VoedingCollection[xxxx].fk_standaardVoedingId" .... />
其中 xxxx
是一个 Guid
。
虽然可以使用 javascript 从文本框中提取 Guid
值(假设使用 @Html.TextBoxFor()
正确生成)并构建关联的隐藏输入的 id 用作选择器,使用类名和相关选择器要容易得多。
您还需要从部分中删除您的脚本和 css,并将其放入主视图(或其布局)中。除了内联脚本之外,您还可以为收藏中的每个项目复制它。
你的部分需要
@using (Html.BeginCollectionItem("VoedingCollection"))
{
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(model => model.fk_standaardVoedingId, "Voeding naam", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10 item"> // add class name
@Html.HiddenFor(model => model.fk_standaardVoedingId)
<input type="text" class="search" placeholder="Search for a product"/>
</div>
</div>
</div>
}
注意文本框及其容器的类名,其中还包括隐藏的输入。然后在主视图中,脚本将是
<script type="text/javascript">
var url = '@Url.RouteUrl("DefaultApi", new { httproute = "", controller = "AgendaApi" })';
// Attach the script to all textboxes
$('.search').autocomplete({
source: function (request, response) {
$.ajax({
url: url,
data: { query: request.term },
dataType: 'json',
type: 'GET',
success: function (data) {
response($.map(data, function (item) {
return {
label: item.standaardVoedingNaam,
value: item.standaardVoedingNaam, // this needs to be the name
id: item.standaardVoedingId // add property for the id
}
}));
}
})
},
select: function (event, ui) {
// Get the associated hidden input
var input = $(this).closest('.item').find('input[type="hidden"]');
// Set the value of the id property
input.val(ui.item.id);
},
minLength: 1
});
</script>
根据您的评论,您没有在 View 中动态添加或删除项目,那么额外开销或使用 BeginCollectionItem()
方法没有意义。将您的部分名称更改为 standaardvoeding.cshtml
(假设这是类的名称)并将其移动到 /Views/Shared/EditorTemplates
文件夹。
然后在主视图中,将 for
循环替换为
@Html.EditorFor(m => m.VoedingCollection)
这将为集合中的每个项目生成正确的 html。最后从模板中删除 BeginCollectionItem()
方法,这样它就可以了
<div class="form-horizontal">
<div class="form-group">
@Html.LabelFor(m => m.fk_standaardVoedingId, "Voeding naam", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10 item"> // add class name
@Html.HiddenFor(m => m.fk_standaardVoedingId)
<input type="text" class="search" placeholder="Search for a product"/>
</div>
</div>
</div>
关于javascript - 使用 Html.BeginCollectionItem 时 MVC AutoComplete EditorFor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39217750/
我正在尝试通过 MVC 5 中的表单提交一次性绑定(bind)我所有的模型数据,使用 Joe Steven 的博客 here 中讨论的 BeginCollectionItem 编辑版本。 . 模型,C
更新代码 - 如果我使用按钮,则 AJAX 调用不起作用,永远不会在 chrome 调试中命中,如果我使用操作链接尝试添加它发送给我的局部 View 部分 View 本身,而不是预期的索引内。 而不
试图使用 Html.BeginCollectionItem 在我的应用程序中工作,并且正在努力获取要发布的数据。我想将项目添加到列表中,然后发布整个列表。我正在使用 ajax 和 jquery 在我的
我正在尝试找到最佳方法(此时任何方法),以便在使用 beginCollectionItem 从列表中删除项目时保持页面滚动位置。 最初我认为这是由于我的主项目中的其他 javascript/jQuer
谁能帮帮我。 @model LioM.Models.Gift @using (Html.BeginCollectionItem("Gifts")) { } 这是我的 MVC5 局部 View 。它显示
我正在使用 Steve Sandersons BeginCollectionItem 扩展来帮助绑定(bind)项目列表。这适用于原始类型。我遇到的问题是,对于我编写的自定义模型 Binder ,我看
我正在使用 Steve Sanderson 的 BeginCollectionItem 方法来添加动态内容。当我在第一级进行时,一切都工作正常。但是,当尝试实现嵌套集合(即另一个 BeginColle
我做了一个小项目来理解 Stephen Muecke 在这里的回答:Submit same Partial View called multiple times data to controller?
我在使用 HTML 帮助程序 BeginCollectionItem 时遇到问题。它似乎将项目绑定(bind)到 View ,但不会传播更改。 我有一个局部 View ,绑定(bind)到它的模型是一
我正在与 Steve Sanderson 的 BeginCollectionItem 合作用于渲染要在 MVC3 中编辑的对象列表的实用程序,当您从迭代器渲染整个集合时,它非常有用。当我尝试向集合中添
我在下面对问题进行了更改,它仍然是相同的,但希望通过模型以及关于我想要实现的目标以及我遇到问题的地方更加清晰。 下面显示了两个类,Company 和 Employee,Company 有一个 Empl
单击按钮时向表中添加/删除行的最佳方法是什么?我需要从 ChildClass 属性创建的行(子类是主类/模型中的列表)。 当前有一个 View (模型是 MyMain),它使用 RenderParti
我正在尝试创建一个自动完成文本框,同时使用 EditorTemplate。我面临的问题是,通过使用 Html.BeginCollectionItem() 扩展解决方案 ( https://www.nu
我正在使用 Steve Sanderson 的 BeginCollectionItem 助手并遇到了问题。我有一个表单,可以选择添加无限奖励字段。我正在使用他的助手,因为它解决了如何继续生成字段的问题
我的主视图中有以下 html 表定义 ColOne
我是一名优秀的程序员,十分优秀!