2016-01-04 2 views
0

у меня есть мнение, что выглядит следующим образом: enter image description hereMVC ActionLink проходящее список объектов

С этой точки зрения я фильтрации записей, которые находятся в базе данных. Каждый «фильтр» является SearchViewModel, который имеет определение класса, как это:

public class SearchViewModel 
{ 
    //Property has a property called "SqlColumnName" 
    public Property Property { get; set; } 
    public Enums.SearchOperator Operator { get; set; } 
    public string Value { get; set; } 
} 

Я сейчас пытаюсь найти решение, как построить ActionLink на этот сайт и переходящая в List<SearchViewModel>(). Так что я пытаюсь сделать что-то вроде этого: http://url/Index?property=Typ&Operator=2&Value=4&property=ServerName&Operator=1&Value=server

Я пытался решить мою проблему с этим http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/, но этот парень звонит Акцию с POST, и мне нужно вызвать его с помощью запроса GET.

Как передать список объектов в действие контроллера mvc с помощью actionlink?

EDIT

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

+0

Вы не должны пытаться передавать сложные данные с помощью запроса GET. Вы должны использовать POST. – Shyju

+0

Попробуйте во втором решении ссылки изменить действие с POST на GET и посмотреть результат? – erikscandola

+0

На самом деле, GET не предназначен для отправки большого количества данных на сервер. Вы должны использовать запрос POST для него, строку запроса или использовать дополнительные параметры запроса, если вы хотите достичь этого с помощью GET – Andrew

ответ

0

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

http://url/Index?%5B0%5D0.property=Typ&%5B0%5D0.Operator=2&%5B0%5D0.Value=4&%5B1%5D0.property=ServerName&%5B1%5D0.Operator=1&%5B1%5D0.Value=server 

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

http://url/Index?id=123 
0

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> 
+0

Спасибо за вашу тяжелую работу, но, к сожалению, так, как вы описали, это следующий шаг в моем рабочем процессе. Мой рабочий процесс выглядит так: ActionLink вызывает «Индекс». Действие отображает SearchFilters и представляет их пользователю. Кнопка поиска отправит эти фильтры другому действию, которое вызывает базу данных. Мне нужно предварительно установить эти фильтры в действии «Индекс». –