Ведение полей ViewModel с привязкой модели по умолчанию и неудачной проверкой - PullRequest
1 голос
/ 11 марта 2010

У меня есть 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++;
}%>

1 Ответ

1 голос
/ 17 марта 2010

Вам придется перепривязать свою модель, если проверка не удалась. В своем операторе else просто добавьте, model.SourceColumns = GetSourceColumns(); и model.DestinationColumns = GetDestinationColumns();, прежде чем снова возвращать представление.

...