现在有一个单页应用程序,以选项卡(tabcontrol)通过ajax的方式加载视图,选项卡不是iframe来呈现的,而是加载后append到body中...
这样每个选项卡对应的内容页中的html控件可能会有id和name冲突的情况(Html.TextBoxFor(....)等),并且所有相关的视图都是加载后放到一个页面的,这样的冲突问题很是头疼。。。
这样的情况怎么样解决?
这必须在设计时定好规则,动态讠d
封装成服务端控件好一点
@沧海一杰:
现在改成这样了,在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: 如果一定不想重复,最好用父控id为前缀
@Kratos Zhang: guid亦可
选择ID的时候先确定父级
这是你的设计问题.
你顶一个命名规则
我现在的想法是在view上 控件呈现前给其强制绑定一个前缀
ViewContext.ViewData.TemplateInfo.HtmlFieldPrefix = Guid.NewGuid().ToString();//或者其他值
然后模型绑定的时候通过自定义ModelBinder来忽略掉以上代码所产生的前缀。
不知道这样可取不。。。感觉命名规则依然无法解决。。