Как передать List <MyCustomClass>из вида в контроллер, если это не форма? - PullRequest
0 голосов
/ 22 октября 2019

У меня есть страница поиска, которая не форма, и она упрощена до следующего.

Моя модель выглядит следующим образом:

public class SearchCategory
{
    public string Category { get; set; }
}
public class SearchViewModel
{
    public string Category { get; set; }
    public List<SearchCategory> Categories { get; set; }
}

InНа мой взгляд, мой ActionLink выглядит следующим образом:

@Html.ActionLink("Displaytext", "Search", "Explore", new { category = "SomeValue", categories = Model.Categories }, null)

ActionResult моего контроллера выглядит следующим образом:

public ActionResult Search(string category, List<SearchCategory> categories)
{
    SearchViewModel SearchModel = new SearchViewModel();
    if (category == null) { SearchModel.Category = "All Entries"; } else { SearchModel.Category = category; }

    if (SearchModel.Category == "All Entries")
    {
        SearchModel.Categories = new List<SearchCategory>();
    }
    else
    {
        SearchModel.Categories = categories;
    }

    SearchCategory c = new SearchCategory();
    c.Category = SearchModel.Category;
    if (SearchModel.Category != "All Entries")
    {
        if (SearchModel.Categories.Contains(c))
        {
            //do nothing, because the categories list already contains this category
        }
        else
        {
            SearchModel.Categories.Add(c);
        }
    }
    return View(SearchModel);
}

В моем контроллере ActionResult я добавляю элементы в categorieslist, и я могу видеть это как заполненный список, если я ставлю точку останова на ActionLink, когда он снова входит в представление. Моя проблема заключается в том, что ActionResult получает пустой указатель вместо заполненного списка, переданного из представления при повторном входе в контроллер.

Что я делаю неправильно? Мне обязательно нужно настроить эту страницу поиска как форму, или есть какой-то способ заставить представление передать заполненный список обратно в контроллер?

1 Ответ

0 голосов
/ 22 октября 2019

Хороший вопрос ... вам приходится иметь дело со строками (не с классом), потому что ASP.NET не конвертирует его в стандартный HTTP-запрос GET

Я сделал пример. Обратите внимание на это "category.categories [@i] .Category" show классы

public class SearchCategory
{
    public string Category { get; set; }
}
    public class SearchViewModel
{
    public List<SearchCategory> Categories { get; set; }
}

Вот мой метод

        public ActionResult Search(string category, SearchViewModel categories)
    {
        if (categories == null) categories = new SearchViewModel { };
        if (categories.Categories == null) categories.Categories = new List<SearchCategory>();
        if (category != null) categories.Categories.Add(new SearchCategory { Category = category }); // add category to the list
        return View(categories);
    }

Вот представление

@model WebApplication6.Models.SearchViewModel
@using WebApplication6.Models;

@{
    ViewBag.Title = "Index";
}
<form>
    @{
        int i = 0;
        if (Model.Categories != null)
        {
            foreach (var item in Model.Categories)
            {

                <input type="hidden" name="categories.categories[@i].Category" value="@item.Category" />
                i++;
            }
        }
        <input type="hidden" name="category" value="Abdallah Hiekal" />
        <input type="submit" name="Click me!" />
    }
</form>
<!--print-->
@if (Model.Categories != null)
{
    foreach (var item in Model.Categories)
    {
        <div>
            @item.Category
            <hr />
        </div>
    }
}
<!--end print-->


<h2>Index</h2>
@Model.Categories.Count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...