Asp.Net MVC 5 - Как я могу передать сложный объект в качестве значения маршрута в Html.ActionLink (), чтобы связыватель модели по умолчанию мог отобразить его?

У меня есть объект, содержащий параметры поиска, сортировки и подкачки страниц, а также идентификатор записи, которую нужно редактировать.

Я хотел бы передать этот объект в Html.ActionLink () как объект значения маршрута, чтобы результирующая строка запроса была правильно отображена механизмом связывания модели по умолчанию в параметр действия Edit, который является EditViewModel.

Идея состоит в том, что после завершения действия Edit он может перенаправить обратно на индекс и сохранить ту же позицию разбивки на страницы / сортировки, в том же наборе данных и отфильтровать по той же строке поиска.

Изменить вид модели:

public class EditViewModel
{
    public SearchSortPageViewModel SearchSortPageParams { get; set; }
    public int Id { get; set; }

    public EditViewModel() 
    {
        SearchSortPageParams = new SearchSortPageViewModel();
        Id = 0;
    }

    public EditViewModel(SearchSortPageViewModel searchSortPageParams, int id)
    {
        SearchSortPageParams = searchSortPageParams;
        Id = id;
    }
}

public class SearchSortPageViewModel
{
    public string SearchString { get; set; }
    public string SortCol { get; set; }
    public string SortOrder { get; set; }
    public int Page { get; set; }
    public int PageSize { get; set; }
}

Изменить действие:

public ActionResult Edit(EditViewModel evm)
    {
        /* ... */
    }

Когда я делаю это в представлении:

@model MyApp.Areas.Books.ViewModels.Books.IndexViewModel
...
@{EditViewModel evm = new EditViewModel(Model.SearchSortPageParams, item.ID);}
@Html.ActionLink("Edit", "Edit", evm)

Я получаю это:

http://localhost:63816/Books/Books/Edit/4?SearchSortPageParams=MyApp.Areas.Base.ViewModels.SearchSortPageViewModel

Но я хочу этого:

http://localhost:63816/Books/Books/Edit/4?SearchSortPageParams.SearchString=abc&SearchSortPageParams.SortCol=name&SearchSortPageParams.SortOrder=asc&SearchSortPageParams.Page=1&SearchSortPageParams.PageSize=3

Единственный способ передать объект до сих пор - вручную подготовить строку запроса, например:

@{string theQueryString = "?SearchSortPageParams.SearchString=" + @evm.SearchSortPageParams.SearchString + "&SearchSortPageParams.SortCol=" + @evm.SearchSortPageParams.SortCol + "&SearchSortPageParams.SortOrder=" + @evm.SearchSortPageParams.SortOrder + "&SearchSortPageParams.Page=" + @evm.SearchSortPageParams.Page + "&SearchSortPageParams.PageSize=" + @evm.SearchSortPageParams.PageSize;}
<a href="@Url.Action("Edit", new { evm.Id })@(theQueryString)">Edit</a>

Я думал о создании пользовательского связывателя модели, но это кажется глупым, учитывая, что связыватель модели по умолчанию уже обрабатывает вложенные объекты, если отформатирован в виде строки запроса так, как он ожидает.

Я также подумал о написании пользовательского сериализатора объектов, который выводит последовательный формат, который ожидает механизм связывания модели по умолчанию, но еще не пошел по этому пути.

Наконец, я подумал о том, чтобы сгладить EditViewModel, чтобы не было ничего вложенного, просто перечислите все свойства без изменений. Но это не идеально.

Итак, каков наилучший путь?

Ответы на вопрос(1)

Ваш ответ на вопрос