У меня есть ASP.Net MVC Controller с действием MapColumns вместе с соответствующей ViewModel и View.
Я использую defaultModelBinder, чтобы связать несколько раскрывающихся списков со словарем в ViewModel. Модель представления также содержит поле IList для столбцов источника и назначения, которые используются для визуализации представления.
У меня вопрос: что делать, если проверка не удалась при вызове Post для действия MapColumns?
В настоящее время представление MapColumns возвращается с ViewModel, полученным в результате привязки по умолчанию. Он содержит значения словаря, но не два списка, используемых для отображения страницы. Каков наилучший способ повторно предоставить их представлению?
Я могу установить их явно после неудачной проверки, но если получение этих значений (через GetSourceColumns () и GetDestinationColumns () в примере) несет какие-либо издержки, это не кажется идеальным. То, что я ищу, - это способ сохранить эти списки, когда они не привязаны к модели из представления.
Вот некоторый код для иллюстрации:
public class TestViewModel
{
public Dictionary<string, string> ColumnMappings { get; set; }
public List<string> SourceColumns;
public List<string> DestinationColumns;
}
public class TestController : Controller
{
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult MapColumns()
{
var model = new TestViewModel;
model.SourceColumns = GetSourceColumns();
model.DestinationColumns = GetDestinationColumns();
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult MapColumns(TestViewModel model)
{
if( Validate(model) )
{
// Do something with model.ColumnMappings
RedirectToAction("Index");
}
else
{
// Here model.SourceColumns and model.DestinationColumns are empty
return View(model);
}
}
}
Соответствующий раздел MapColumns.aspx:
<%
int columnCount = 0;
foreach(string column in Model.targetColumns)
{%>
<tr>
<td>
<input type="hidden" name="ColumnMappings[<%= columnCount %>].Value" value="<%=column %>" />
<%= Html.DropDownList("ColumnMappings[" + columnCount + "].Key", Model.DestinationColumns.AsSelectItemList())%>
</td>
</tr>
<%
columnCount++;
}%>