首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TagBuilder不生成跨ajax请求的unqiue属性值

TagBuilder不生成跨ajax请求的unqiue属性值
EN

Stack Overflow用户
提问于 2015-08-28 09:20:57
回答 1查看 350关注 0票数 5

在使用相同的模板在页面上呈现某些内容以及使用相同的模板使用AJAX请求在页面上呈现其他内容时,我遇到了一个问题。

以下代码呈现部分剃须刀视图:

代码语言:javascript
复制
@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请求:

代码语言:javascript
复制
$.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中断。

下面是输出两次(一次在请求期间,然后在AJAX请求期间添加到页面的一个单独部分)的HTML:

代码语言:javascript
复制
<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是重复的。

是否有任何方法可以解决这个问题,或者是否有更好的方法来呈现表单元素以避免这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-10 19:08:59

您可以为项目指定自己的ID,这样就不会出现ID冲突问题。您是否尝试过手动设置id:Html.TextBoxFor( ... , new { id = "AnythingHere" }),其中的id可以是新生成的Guid?(请注意,您可能需要添加一个前缀,因为Guid可以以数字开头。

所以你可以使用以下方法。Guid看起来不太好,而且没有必要的长。你可能想用更短的东西,比如短guid,DateTime.Ticks,.

代码语言:javascript
复制
@{
  var id = "chk_" + Guid.NewGuid().ToString();
}
@Html.CheckBoxFor(..., new { id = id })
@Html.LabelFor(..., new { @for = id })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32267587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档