Jquery 引导选项卡+;根据模型值下拉选定项
我有一个(可能很简单)问题。 我真的很难解释我到底想做什么 我有一个页面循环浏览项目列表,并为每个项目创建一个新选项卡。 我在使用引导标签 (这很有效) 我知道这是可怕的MVC->但我对web开发相当陌生-这就是为什么我感觉自己像是在atm池的最深处Jquery 引导选项卡+;根据模型值下拉选定项,jquery,asp.net-mvc,twitter-bootstrap,Jquery,Asp.net Mvc,Twitter Bootstrap,我有一个(可能很简单)问题。 我真的很难解释我到底想做什么 我有一个页面循环浏览项目列表,并为每个项目创建一个新选项卡。 我在使用引导标签 (这很有效) 我知道这是可怕的MVC->但我对web开发相当陌生-这就是为什么我感觉自己像是在atm池的最深处 @foreach (var item in Model.Items) { <li role="presentation"> <a href="#@item
@foreach (var item in Model.Items)
{
<li role="presentation">
<a href="#@item.EndDate.ToString("M").Replace(" ", "")" aria-controls="@item.EndDate.ToString("M").Replace(" ", "")" role="tab" data-toggle="tab">@item.EndDate.ToString("d")</a>
</li>
}
@using (Html.BeginForm())
{
<div class="tab-content col-md-10">
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@foreach (var item in Model.Items)
{
<div role="tab-pane" class="tab-pane" id="@item.EndDate.ToString("M").Replace(" ", "")">
<div class="col-md-5">
<div>
@Html.LabelFor(mx => item.Assignment)
</div>
etc...
@foreach(Model.Items中的变量项)
{
}
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@foreach(Model.Items中的var项)
{
@LabelFor(mx=>item.Assignment)
等
在每个选项卡中,我都有一些文本框和其他内容,还有一个下拉列表,它基本上是其他内容的选择器
<div>
@{
var listItems = new List<ListItem> { new ListItem { Text = "Calendar", Value = "Calendar" }, new ListItem { Text = "Email", Value = "Email" } };
}
@Html.DropDownListFor(x => item.Type, new SelectList(listItems), "-- Select Type --", new { @id = item.ItemId +"_TypeSelector", @class="TypeSelector" })
@Html.ValidationMessageFor(x => item.Type)
</div>
@{
var listItems=new List{new ListItem{Text=“Calendar”,Value=“Calendar”},new ListItem{Text=“Email”,Value=“Email”};
}
@DropDownListFor(x=>item.Type,new SelectList(listItems),“--Select Type--”,new{@id=item.ItemId+“_TypeSelector”,@class=“TypeSelector”})
@Html.ValidationMessageFor(x=>item.Type)
我的问题;
下拉列表未根据模型值选择正确的值
提前感谢。在
foreach
循环中呈现集合将给控件提供重复的名称,因此您将无法回发并绑定到集合。您可以通过使用for
循环或使用自定义编辑器模板来正确处理此问题。不幸的是@Html.DropDownListFor()
对于服务器在循环()中查看绑定来说无法正常工作,因此在您的情况下,您需要使用EditorTemplate
生成选项的方式也没有多大意义,这意味着每次迭代都要创建一个新的SelectList
。这应该在控制器中创建,并作为视图模型中的属性或通过ViewBag
传递,如下所示
List<string> items = new List<string>(){ "Calendar", "Email" };
ViewBag.ItemList = new SelectList(items);
在主要观点中
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="tab-content col-md-10">
@EditorFor(m => m.Items, new { ItemList = ViewBag.ItemList })
</div>
}
如果属性Type
的值为日历“
,则在视图中选择第二个选项;如果属性的“电子邮件”
,则选择第三个选项;否则选择第一个(标签)选项将被选中。实际上它根本不起作用。您的foreach
循环正在创建重复的id
(无效的html)和name
属性,因此当您发回时,不会有任何内容绑定到您的集合。因为您需要为您的模型创建一个自定义EditorTemplate
,如Om所示,实际上通过添加带有字符串的项目id为所有内容提供唯一id,因此所有id实际上都是唯一的OK,错过了这一点,但是它们有相同的名称,因此它们不会发回集合。根据链接使用EditorTemplate
不仅可以使用索引器正确命名它们,还可以为它们提供唯一的id(因此无需使用html属性添加此项)然后根据属性的值选择正确的选项Type
哦,太酷了。我来看看,谢谢。我还有一些javascript检查“更改的”事件-此解决方案是否适用-检查每个不同的下拉列表是否具有相同的类?它不起作用,它没有给我唯一的Id,下拉列表显示为文本框。这可能是因为我使用嵌套类吗?在我的控制器中,我得到一个ItemA列表,每个ItemA包含一个ItemB列表->editortemplate是对于ItemB-我的类不是通过给你唯一id的方式添加的(重复id是无效的html!)。如果它给你一个文本框,它就找不到EditorTemplate
。你给它命名正确吗(见我回答的第3段-你还没有发布模型,所以我猜是模型。Items
是一个类名Item
)的集合,那么我是否仍然使用我的foreach(模型中的var Item)?否。事实上,如果使用循环,EditorFor()
无法正常工作。那么我如何循环所有项目并将它们显示为不同的选项卡呢?现在我每次循环一个项目时都会创建一个选项卡-这就是为什么我一直在使用foreach-我的意思是,如果我不使用循环,代码如何知道生成多个选项卡?
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div class="tab-content col-md-10">
@EditorFor(m => m.Items, new { ItemList = ViewBag.ItemList })
</div>
}
<select name="Items[0].Type" id="Items_0__Type" class="typeselector">
<select name="Items[1].Type" id="Items_1__Type" class="typeselector">