我正在尝试将SelectListItem
传递给视图。此checkbok列表将在具有日期范围的JavaScript对话框中的视图中可见。
从以下代码中,方法ReadLogFile
返回正确的SelectListItem
。我从控制器动作方法中调用此方法。我的实体包含一个名为RunDatesDisplay
的属性,它是一个IEnumerable
列表。我可以创建此属性作为选择列表项,但我不想在我的域项目中引用System.Web.Mvc
命名空间?
问题是我无法将selectlist项目强制转换为实体中的IEnumerable
列表以传递给视图。我创建了一个listview模型,在视图中我将调用编辑器模板来呈现复选框。
我只是需要帮助才能正确地将选择列表项传递给视图。
我应该使用SelectListItem
将ViewBag
传递给模型属性,例如ViewBag.RunDatesDisplay = items(selectlistitem)
还是我应该首先将我的selectlistitem绑定到选择列表?
实体:
public class RunLogEntry
{
public int ID { get; set; }
public int RunID { get; set; }
[NotMapped]
public bool? LoadFileAttached { get; set; }
[NotMapped]
public bool? OutFileAttached { get; set; }
[NotMapped]
public string AttachedLoadListFileName { get; set; }
[NotMapped]
public string AttachedOutputFileName { get; set; }
[NotMapped]
public List<RunLogEntryTestExceptionDisplay> TestExceptionDisplay { get; set; }
[NotMapped]
public IEnumerable<RunLogEntryDatesDisplay> RunDatesDisplay { get; set; }
}
进行一些处理并返回selectlistitem的方法:
public static List<SelectListItem> ReadLogFile(List<string> fileNames)
{
//Get collection of files and send to parser file by file:
LogFile lf = new LogFile();
var items = new List<SelectListItem>();
foreach (var minDate in minDates)
{
var item = new SelectListItem() { Value = minDate.ToString(), Text = String.Format("{0} - {1}", minDate, minDate.AddMinutes(30)) };
items.Add(item);
}
return items;
}
控制器操作(我没有包含操作的整个代码)
//3. Send log file name collection to parser
if (logFiles != null && logFiles.Count > 0)
{
var items = new List<SelectListItem>();
items = FileImport.ReadLogFile(logFiles);
**RunLogEntry.RunDatesDisplay = FileImport.ReadLogFile(logFiles);**
视图模型:
public class RunLogRunDatesViewModel
{
public IEnumerable<SelectListItem> RunLogRunDates { get; set; }
}
编辑模板
@model RunLog.Domain.Entities.RunDatesDisplay
<tr>
<td>
@Html.DisplayFor(x => x.RunDate)
</td>
</tr>
最后我的观点是:
<div id="runDatestreeview" title="Dialog Title" style="font-size: 10px; font-weight: normal;
overflow: scroll; width: 800px; height: 450px; display: none;">
<table class="grid" style="width: 600px; margin: 3px 3px 3px 3px;">
<thead>
<tr>
<th>
Run Dates:
</th>
</tr>
</thead>
<tbody>
@if (Model.RunDatesDisplay != null)
{
@Html.EditorFor(x => x.RunDatesDisplay)
}
</tbody>
</table>
</div>
答案 0 :(得分:0)
您可以使用两个属性创建自定义类型,或者只使用Tuple
类,这样就可以了
ReadLogFile
可能是这样的
public static List<Tuple<string,string>> ReadLogFile(List<string> fileNames)
{
...
var items = new List<Tuple<string,string>>();
foreach (var minDate in minDates)
{
var item = new Tuple<string, string>(minDate.ToString(), String.Format("{0} - {1}", minDate, minDate.AddMinutes(30));
items.Add(item);
}
return items;
}
你的模特:
public class RunLogRunDatesViewModel
{
public SelectList RunLogRunDates { get; set; }
}
你的控制器:
var model = new RunLogRunDatesViewModel();
List<Tuple<string,string>> items = FileImport.ReadLogFile(logFiles);
model.RunLogRunDates = new SelectList(items, "Item1", "Item2");
SelectList将尝试从“Item1”获取Value,从“Item2”获取Text
或者,正如我在开始时所说,您可以创建具有两个属性的简单类,以避免使用元组
<强> UPDATE1 强> 在.Net 2.0-3.5中,您可以为它创建简单的包装器:
public class Tuple<T1,T2>
{
public T1 Item1 {get;set;}
public T2 Item2 {get;set;}
}