首页 新闻 搜索 专区 学院

mvc多tab选项卡呈现的页面,控件id冲突怎么解决

0
悬赏园豆:10 [已解决问题] 解决于 2014-01-23 17:09

现在有一个单页应用程序,以选项卡(tabcontrol)通过ajax的方式加载视图,选项卡不是iframe来呈现的,而是加载后append到body中...

 

这样每个选项卡对应的内容页中的html控件可能会有id和name冲突的情况(Html.TextBoxFor(....)等),并且所有相关的视图都是加载后放到一个页面的,这样的冲突问题很是头疼。。。

这样的情况怎么样解决?

Kratos Zhang的主页 Kratos Zhang | 初学一级 | 园豆:6
提问于:2014-01-22 21:17
< >
分享
最佳答案
0

这必须在设计时定好规则,动态讠d

收获园豆:10
空明流光 | 初学一级 |园豆:48 | 2014-01-23 11:03

封装成服务端控件好一点

空明流光 | 园豆:48 (初学一级) | 2014-01-23 11:06

@沧海一杰: 

现在改成这样了,在action执行完成后生成统一id前缀。

//Id Prefix
            ViewData["__token__"] = string.Format("{0}_", Guid.NewGuid());

控件都类似下面这样赋予id值

public static MvcHtmlString StyledRadioButtonFor<TModel>(this HtmlHelper<TModel> htmlHelper,
            Expression<Func<TModel, bool>> expression, object htmlAttributes = null)
        {
            var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
            var id = GetIdPrefix(htmlHelper, ExpressionHelper.GetExpressionText(expression));

            if (attrs.ContainsKey("id"))
                attrs["id"] = id;
            else
                attrs.Add("id", id);

            return htmlHelper.RadioButtonFor(expression, attrs);
        }
Kratos Zhang | 园豆:6 (初学一级) | 2014-01-23 12:30

@Kratos Zhang: 如果一定不想重复,最好用父控id为前缀

空明流光 | 园豆:48 (初学一级) | 2014-01-23 12:45

@Kratos Zhang: guid亦可

空明流光 | 园豆:48 (初学一级) | 2014-01-23 12:47
其他回答(2)
0

选择ID的时候先确定父级

平常心队长 | 园豆:1113 (小虾三级) | 2014-01-23 09:21
0

这是你的设计问题.

你顶一个命名规则

【秦时明月】 | 园豆:851 (小虾三级) | 2014-01-23 09:40

我现在的想法是在view上 控件呈现前给其强制绑定一个前缀

ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = Guid.NewGuid().ToString();//或者其他值

然后模型绑定的时候通过自定义ModelBinder来忽略掉以上代码所产生的前缀。

不知道这样可取不。。。感觉命名规则依然无法解决。。

支持(0) 反对(0) Kratos Zhang | 园豆:6 (初学一级) | 2014-01-23 10:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册