ActionLink
вспомогательный метод визуализирует якорный тег. Достаточно передать несколько элементов строки запроса по ссылке. Помните строку запроса has a limit о том, сколько данных вы можете передать, и оно зависит от браузера и браузера.
Что вы должны делать, это размещение формы. Вы можете сделать запись формы в событии click на div с помощью небольшого javascript.
Давайте создадим новую модель представления для нашей страницы поиска
public class SearchVm
{
public List<SelectListItem> Operators { set; get; }
public List<SearchViewModel> Filters { set; get; }
}
public class SearchViewModel
{
//Property has a property called "SqlColumnName"
public Property Property { get; set; }
public SearchOperator Operator { get; set; }
public string Value { get; set; }
}
Так что в вашем GET действия, Вы послали список SearchViewModel
для просмотра.
public ActionResult Index()
{
var search = new SearchVm
{
Filters = new List<SearchViewModel>
{
new SearchViewModel {Property = new Property {SqlColumn = "Name"}},
new SearchViewModel {Property = new Property {SqlColumn = "Age"}},
new SearchViewModel {Property = new Property {SqlColumn = "Location"}}
}
};
//Convert the Enums to a List of SelectListItem
search.Operators= Enum.GetValues(typeof(SearchOperator)).Cast<SearchOperator>()
.Select(v => new SelectListItem
{
Text = v.ToString(),
Value = ((int)v).ToString()
}).ToList();
return View(search);
}
А на ваш взгляд, который сильно типизированных на ваш взгляд модели SearchVm
, мы будем манипулировать имена полей формы так, что модель привязки будет работать, когда форма была отправлена.
@model SearchVm
@using (Html.BeginForm())
{
var i = 0;
foreach (var criteria in Model.Filters)
{
<label>@criteria.Property.SqlColumn</label>
@Html.HiddenFor(f => f.Filters[i].Property.SqlColumn)
@Html.DropDownList("Filters[" + i+ "].Operator",Model.Operators)
@Html.TextBoxFor(f=>f.Filters[i].Value)
i++;
}
<div id="someDiv">Search button using Div</div>
<input type="submit" value="Search" />
}
И ваш метод действия HttpPost для обработки формы submit.
[HttpPost]
public ActionResult Index(SearchVm model)
{
foreach(var f in model.Filters)
{
//check f.Property.SqlColumn, f.Value & f.Operator
}
// to do :Return something useful
}
Если вы хотите, чтобы форма должны быть представлены на событие щелчка на DIV, Слушайте событие щелчка на конкретный ДИВ и вызвать метод представить на форме ДИВ проживает в.
<script>
$(function() {
$("#someDiv").click(function(e) {
$(this).closest("form").submit();
});
});
</script>
Вы не должны пытаться передавать сложные данные с помощью запроса GET. Вы должны использовать POST. – Shyju
Попробуйте во втором решении ссылки изменить действие с POST на GET и посмотреть результат? – erikscandola
На самом деле, GET не предназначен для отправки большого количества данных на сервер. Вы должны использовать запрос POST для него, строку запроса или использовать дополнительные параметры запроса, если вы хотите достичь этого с помощью GET – Andrew