TagBuilder没有跨ajax请求生成唯一的id属性值
本文关键字:唯一 id 属性 求生 ajax 请求 TagBuilder | 更新日期: 2023-09-27 18:10:16
我有一个问题,我使用相同的模板来呈现页面上的一些内容,相同的模板用于使用AJAX请求呈现页面上的其他内容。
下面的代码呈现部分剃刀视图:
@model SearchBoxViewModel
<div class="smart-search">
@using (Html.BeginForm("Index", "Search", FormMethod.Get, new { @class = "form-horizontal", role = "form" }))
{
<div class="form-group">
<div class="hidden-xs col-sm-1 col-md-1 col-lg-1 text-right">
@Html.LabelFor(m => m.SearchPhrase, new { @class = "control-label heading" })
</div>
<div class="col-xs-8 col-md-9 col-lg-10">
@Html.TextBoxFor(m => m.SearchPhrase, new {@class = "form-control", placeholder = "for products, companies, or therapy areas"})
</div>
<div class="col-xs-4 col-sm-3 col-md-2 col-lg-1">
<input type="submit" value="Search" class="btn btn-default"/>
</div>
<div class="what-to-search hidden-11 col-sm-11 col-sm-offset-1">
<div class="checkbox">
<label>
@Html.CheckBoxFor(m => m.WhatToSearch, null, false)
@Html.DisplayNameFor(m => m.WhatToSearch)
</label>
</div>
</div>
</div>
}
</div> <!-- /.smart-search -->
以下代码发出AJAX请求:
$.ajax(anchor.attr("data-overlay-url-action"))
.done(function (data) {
$("div.overlay").addClass("old-overlay");
$("div.navbar").after(data);
$("div.overlay:not(.old-overlay)")
.attr("data-overlay-url-action", anchor.attr("data-overlay-url-action"))
.hide()
.fadeIn();
$("div.old-overlay")
.fadeOut()
.removeClass("old-overlay");
anchor.addClass("overlay-exists");
});
因此,您在页面上得到的是两次相同的部分剃刀视图输出,一次在页面请求期间,一次在AJAX请求期间。
问题是TextBoxFor, CheckBoxFor等都使用TagBuilder。GenerateId用于生成id属性值,但它不考虑在可能涉及AJAX的多个请求之间生成id。这将导致在页面上输出相同的id值,从而导致JavaScript中断。
以下是输出两次的HTML(一次在请求期间,然后在AJAX请求期间添加在页面的单独部分):
<div class="smart-search">
<form role="form" method="get" class="form-horizontal" action="/PharmaDotnet/ux/WebReport/Search"> <div class="form-group">
<div class="hidden-xs col-sm-1 col-md-1 col-lg-1 text-right">
<label for="SearchPhrase" class="control-label heading">Search</label>
</div>
<div class="col-xs-8 col-md-9 col-lg-10">
<input type="text" value="" placeholder="for products, companies, or therapy areas" name="SearchPhrase" id="SearchPhrase" class="form-control">
</div>
<div class="col-xs-4 col-sm-3 col-md-2 col-lg-1">
<input type="submit" class="btn btn-default" value="Search">
</div>
<div class="what-to-search hidden-11 col-sm-11 col-sm-offset-1">
<div class="checkbox">
<label>
<input type="checkbox" value="true" name="WhatToSearch" id="WhatToSearch">
NewsManager Search Only
</label>
</div>
</div>
</div>
</form></div>
所以SearchPhrase和WhatToSearch的id是重复的。
是否有任何方法来解决这个问题,或者有更好的方法来渲染表单元素来避免这个问题?
您可以为项目指定自己的ID,这样就不会出现ID冲突的问题。您是否尝试手动设置id: Html.TextBoxFor( ... , new { id = "AnythingHere" })
,其中id可以是新生成的Guid?(注意,您可能需要添加前缀,因为guid可以以数字开头。
所以你可以使用下面的代码。指南看起来不太好,而且不必要的长。您可能想要使用更短的内容,例如short guid, DateTime.Ticks
,…
@{
var id = "chk_" + Guid.NewGuid().ToString();
}
@Html.CheckBoxFor(..., new { id = id })
@Html.LabelFor(..., new { @for = id })