【发布时间】:2016-03-25 19:28:32
【问题描述】:
我有一个视图模型,用于在一个视图上显示表单,然后也用于将 POST 数据表示为操作。然后,该操作会显示另一个视图模型,其中包含来自第一个视图模型的大部分相同数据。但是,第一个视图模型有几个“仅显示”属性,第二个视图模型也需要这些属性(也只能在第二个视图上显示)。
我想知道将这个“仅显示”数据传递给第二个视图的最佳方式是什么。目前,我想出的最佳解决方案是有一堆隐藏的表单字段,其中包含仅显示的属性值,然后模型会自动填充处理表单 POST 的操作。但是,使用隐藏的表单字段似乎非常“hackish”,并且似乎应该有更好的解决方案将此数据传递到另一个视图该操作不需要仅显示信息,它只是访问它以填充属性传递给第二个视图的第二个视图模型。
让我用代码来解释我的问题,因为我所追求的可能通过代码比文字更好地理解。
型号:
public class SearchFilters
{
// ...
}
public class SearchResult
{
public int Id { get; set; }
public bool Selected { get; set; }
public string SomeDisplayValue1 { get; set; }
public string SomeDisplayValue2 { get; set; }
// ...
}
public class ResultsViewModel
{
public IList<SearchResult> Results { get; set; }
// ...
}
public class DoSomethingWithSelectedResultsViewModel
{
public IList<SearchResult> SelectedResults { get; set; }
public string SomeOtherProperty { get; set; }
// ...
}
控制器:
[HttpPost]
public ActionResult Results(SearchFilters filters)
{
ResultsViewModel results = new ResultsViewModel();
// ...
return new View(results);
}
[HttpPost]
public ActionResult DoSomethingWithSelectedResults(ResultsViewModel model)
{
// ...
return View(new DoSomethingWithSelectedResultsViewModel
{
SelectedResults = model.Results.Where(r => r.Selected).ToList(),
SomeOtherProperty = "...",
// ...
});
}
查看:Results.cshtml
@model ResultsViewModel
@using (Html.BeginForm("DoSomethingWithSelectedResults", "Search"))
{
<table>
for (int i = 0; i < Model.Results.Count; i++)
{
<tr>
<td>
@Html.CheckBoxFor(m => Model.Results[i].Selected)
@* I would like to eliminate these hidden inputs *@
@Html.HiddenFor(m => Model.Results[i].Id)
@Html.HiddenFor(m => Model.Results[i].SomeDisplayValue1)
@Html.HiddenFor(m => Model.Results[i].SomeDisplayValue2)
</td>
<td>@Html.DisplayFor(m => Model.Results[i].SomeDisplayValue1)</td>
<td>@Html.DisplayFor(m => Model.Results[i].SomeDisplayValue2)</td>
<tr>
}
</table>
<button type="submit">Do Something With Selected Results</button>
}
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-4