从剃刀视图中的循环中删除列表

问题描述:

我想在剃刀视图中的循环中使用下拉列表。下拉列表在初始页面加载时正确显示,但模型绑定在帖子上不起作用。在下拉列表中选择的项目在帖子中不可用。 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> 

} 
+0

您能否请您展示您的观点? – JanR

+0

刚刚添加....谢谢。 – Chaos

+0

'tableColumns'是一个复杂的对象,您不能将一个

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并通过使用SelectListadditionalViewDatathis answer
  • DropDownListFor()的第三参数产生null 项中的说明。我假设你会希望用户选择一个值,所以你 应该添加一个[Required]属性到SelectedColumn和包括 ​​在 的视图。
+0

非常感谢。 – Chaos

你应该隐藏要素的集合呈现tableColumns,下拉值应绑定到的属性SelectedColumnDataMappingViewModel

 @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