从剃刀视图中的循环中删除列表
问题描述:
我想在剃刀视图中的循环中使用下拉列表。下拉列表在初始页面加载时正确显示,但模型绑定在帖子上不起作用。在下拉列表中选择的项目在帖子中不可用。 tableColumns属性是空的。任何帮助将非常感激。从剃刀视图中的循环中删除列表
型号
public class DataMappingViewModel
{
public string TableName { get; set; }
public List<XmlElement> XmlElements { get; set; }
}
public class XmlElement
{
public string ElementName { get; set; }
public List<SP_GET_DBASE_COLUMNS_Result> tableColumns { get; set; }
}
public partial class SP_GET_DBASE_COLUMNS_Result
{
public string TABLE_CATALOG { get; set; }
public string TABLE_SCHEMA { get; set; }
public string TABLE_NAME { get; set; }
public string COLUMN_NAME { get; set; }
public Nullable<int> ORDINAL_POSITION { get; set; }
public string COLUMN_DEFAULT { get; set; }
public string IS_NULLABLE { get; set; }
public string DATA_TYPE { get; set; }
public Nullable<int> CHARACTER_MAXIMUM_LENGTH { get; set; }
public Nullable<int> CHARACTER_OCTET_LENGTH { get; set; }
public Nullable<byte> NUMERIC_PRECISION { get; set; }
public Nullable<short> NUMERIC_PRECISION_RADIX { get; set; }
public Nullable<int> NUMERIC_SCALE { get; set; }
public Nullable<short> DATETIME_PRECISION { get; set; }
public string CHARACTER_SET_CATALOG { get; set; }
public string CHARACTER_SET_SCHEMA { get; set; }
public string CHARACTER_SET_NAME { get; set; }
public string COLLATION_CATALOG { get; set; }
public string COLLATION_SCHEMA { get; set; }
public string COLLATION_NAME { get; set; }
public string DOMAIN_CATALOG { get; set; }
public string DOMAIN_SCHEMA { get; set; }
public string DOMAIN_NAME { get; set; }
}
控制器
public ActionResult Index()
{
List<XmlElement> elements = new List<XmlElement>();
XmlElement element1 = new XmlElement();
element1.ElementName = "element1";
element1.tableColumns = data.GetTableColumns("TABLENAME");
elements.Add(element1);
DataMappingViewModel viewitem = new DataMappingViewModel();
viewitem.XmlElements = elements;
viewitem.TableName = "TABLENAME";
return View(viewitem);
}
[HttpPost]
public ActionResult MapData(DataMappingViewModel model)
{
return View("Index",model);
}
查看
@model ExcelImportAPI.Models.DataMappingViewModel
@using System.Web.Mvc;
@{
ViewBag.Title = "title";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("MapData", "DataMapping", FormMethod.Post))
{
<h2>Data Mapping</h2>
for (var i = 0; i < Model.XmlElements.Count; i++)
{
@Html.HiddenFor(m => Model.XmlElements[i].ElementName)
@Model.XmlElements[i].ElementName
<td>
@Html.DropDownList("tableColumns", new SelectList(@Model.XmlElements[i].tableColumns, "COLUMN_NAME", "COLUMN_NAME"), "--Select a Value--")
</td>
}
<div class="modal-footer">
<input type="submit" name="btnSaveAndExit" value="Save and Exit" class="btn btn-default">
<input type="submit" name="btnSaveAndContinue" value="Save and Continue" class="btn btn-primary modal-btn">
</div>
}
答
tableColumns
是一个复杂的对象,你不能一个<select>
元素复杂的对象绑定(只回发一个简单的值 - 所选选项的值而你的情况是COLUMN_NAME
属性的值) 。
您的视图模型需要的属性绑定到,最好是一种简化的集合属性绑定到
public class DataMappingViewModel
{
public string TableName { get; set; }
public List<XmlElementViewModel> XmlElements { get; set; }
public IEnumerable<string> ColumnList { get; set; } // for generating the SelectLists
}
public class XmlElementViewModel
{
public string ElementName { get; set; }
public string SelectedColumn { get; set; } // to bind the selected value to
}
,你会得到那么方法将
public ActionResult Index()
{
DataMappingViewModel model= new DataMappingViewModel()
{
TableName = "TABLENAME",
ColumnList = data.GetTableColumns("TABLENAME").Select(x => x.COLUMN_NAME),
XmlElements = new List<XmlElement>()
{
new XmlElement()
{
ElementName = "element1",
SelectedColumn = "...." // if you want to preselect an option
}
}
}
return View(model);
}
然后在视图
model ExcelImportAPI.Models.DataMappingViewModel
....
@using (Html.BeginForm("MapData", "DataMapping", FormMethod.Post))
{
....
for (var i = 0; i < Model.XmlElements.Count; i++)
{
@Html.HiddenFor(m => Model.XmlElements[i].ElementName)
@Model.XmlElements[i].ElementName
<div>
@Html.DropDownListFor(m => m.XmlElements[i].SelectedColumn, new SelectList(Model.ColumnList), "--Select a Value--")
</div>
}
....
}
附注:
- 您的视图显示了
<td>
元素,但没有包含<tr>
和<table>
元素,但它似乎并不需要在这里表格。 - 你不需要
@using System.Web.Mvc;
视图 - 通常你
SelectList
应在控制,因为你使用创建循环中的下拉列表中产生,但 ,你需要 生成在每次迭代中新SelectList
,或使用一个EditorTemplate
并通过使用SelectList
additionalViewData
如this answer - 的
DropDownListFor()
的第三参数产生null
项中的说明。我假设你会希望用户选择一个值,所以你 应该添加一个[Required]
属性到SelectedColumn
和包括 在 的视图。
+0
非常感谢。 – Chaos
答
你应该隐藏要素的集合呈现tableColumns
,下拉值应绑定到的属性SelectedColumn
DataMappingViewModel
:
@Html.DropDownList("SelectedColumn", new SelectList(Model.XmlElements[i].tableColumns, "COLUMN_NAME", "COLUMN_NAME"), "--Select a Value--")
@for(var j = 0; j < Model.XmlElements[i].tableColumns.Count; j ++)
{
@Html.Hidden(string.Format("XmlElements[{0}].tableColumns[{1}].COLUMN_NAME", i, j), Model.XmlElements[i].tableColumns[j].COLUMN_NAME)
}
+0
感谢您的回复。 – Chaos
您能否请您展示您的观点? – JanR
刚刚添加....谢谢。 – Chaos
'tableColumns'是一个复杂的对象,您不能将一个