Отправить список строк в контроллер с помощью RouteValueDictionary

У меня есть экран поиска, который дает результаты в постраничном списке. При смене страницы мне нужно получить значения модели методом GET в контроллере. Хотя мне удалось передать свойства модели, которые являются строками, у меня возникла проблема с передачей списка строк.

Код просмотра:

<div class="divSearch">
<div class="divCriteria">
    <div class="row">
        <div class="col-md-6">
            @Html.LabelFor(m => m.Name)
            @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
        </div>
        <div class="col-md-6">
            @Html.LabelFor(m => m.Owner)
            @Html.TextBoxFor(m => m.Owner, new { @class = "form-control" })
        </div>
    </div>
    <br />
    <div class="row">
        <div class="col-md-6">
            @Html.LabelFor(m => m.County)
            @Html.ListBoxFor(model => model.County, Model.CountiesList, new { @class = "form-control", multiple = "multiple" })
        </div>
    </div>
    <br />
    <div class="row">
        <div class="right">
            <button type="submit" class="btn btn-primary"><i class="fa fa-share-square-o"></i>Search</button>
        </div>
    </div>
</div>

<div class="divResults">
    <div class="table-responsive">
        <table class="table table-hover table-advance dataTable">
            <thead>
                <tr>
                   <th style="display:none">ID</th>
                    <th>Name</th>
                    <th>Type</th>
                    <th>County</th>                       
                </tr>
            </thead>
            <tbody>

                @foreach (var item in Model.SearchList)
                {
                    <tr>
                        <td>
                            @Html.DisplayFor(modelItem => item.Name)
                            @Html.HiddenFor(modelItem => item.ID)
                        </td>

                        <td>
                            @Html.DisplayFor(modelItem => item.Type)
                        </td>

                        <td>
                            @Html.DisplayFor(modelItem => item.County)
                        </td>                                                 
                    </tr>
                }
            </tbody>
        </table>
    </div>
</div>

@if (Model.SearchList != null)
{
var county = new List<string>();
foreach (var item in Model.County)
{
    county.Add(item);
}

@Html.PagedListPager(Model.SearchList, Page => Url.Action("Index", "FacilityFinder", new RouteValueDictionary() { { "Page", Page }, { "name", Model.Name },  { "owner", Model.Owner }, { "county", county} }),PagedListRenderOptions.PageNumbersOnly)
 }

Код контроллера:

public ActionResult Index(int? page=null,string name = null, List<string> county=null,string owner = null)
{
}

Значение для имени и владельца в контроллере в порядке, но список округов дает мне System.Collections.Generic.List`1[System.String]

Я что-то упускаю?


person TheFallenOne    schedule 14.02.2017    source источник


Ответы (1)


Вы не можете передавать сложные типы, такие как списки. Возможно, вам потребуется создать RouteValueDictionary динамически:

var query = new RouteValueDictionary
{ 
    { "name", Model.Name },  
    { "owner", Model.Owner }
};

for (var i = 0; i < Model.County.Count; i++)
{
    query["county[" + i + "]"] = Model.County[i];
}

@Html.PagedListPager(
    Model.SearchList, 
    Page => Url.Action("Index", "FacilityFinder", new RouteValueDictionary(query) { { "Page", Page } }),
    PagedListRenderOptions.PageNumbersOnly
)

чтобы результирующий URL-адрес выглядел так:

/FacilityFinder/Index?Page=5&name=Foo&owner=Bar&county[0]=foo1&county[1]=foo2...

что сделает связыватель модели по умолчанию в ASP.NET MVC счастливым и правильно привяжет его к List<string>.

person Darin Dimitrov    schedule 14.02.2017
comment
Ошибка компиляции: локальная переменная с именем «Страница» не может быть объявлена ​​в этой области, потому что это придаст другое значение «Странице», которая уже используется в «родительской или текущей» области для обозначения чего-то еще. - person TheFallenOne; 14.02.2017
comment
к сожалению, Page является динамическим, я обновил свой ответ примером того, как с этим справиться. - person Darin Dimitrov; 14.02.2017