2014-10-08 3 views
-1

Я пытаюсь передать объект C# в качестве параметра обратно в контроллер. Это делается так:MVC4 не передаст модель контроллеру

@model Models.AdvancedSearchTerms 

@{ 
    ViewBag.Title = "Loading"; 
}  


@Html.DisplayFor(Model => Model.Keyword) 

@using (Html.BeginForm("MetaSearch", "AdvancedSearch", new { term = Model }, FormMethod.Post)) 
{ 
    <input id="startGatheringData" type="Submit" name="Convert" /> 
} 

Как вы видите, я пытаюсь отправить всю модель обратно в контроллер, если кнопка нажата. Но когда метод в контроллере получает модель, он равен нулю. Чтобы убедиться, что модель не пуста в представлении, вы можете увидеть, что я попытался напечатать переменную с помощью @ Html.DisplayFor, и она работает. Таким образом, модель не пусто в представлении, но исчезает, когда я прохожу его к контроллеру:

public ActionResult MetaSearch(AdvancedSearchTerms term) 
    { 

     //Do stuff with the model retrived from the View() 
     return View() 
    } 

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

Заранее благодарю!

ответ

0

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

@using (Html.BeginForm("MetaSearch", "AdvancedSearch", FormMethod.Post)) 
{ 
    @Html.HiddenFor(x=>x.SomeProperty) 
    @Html.HiddenFor(x=>x.SomeProperty) 

    <input id="startGatheringData" type="Submit" name="Convert" /> 
} 
+0

Ах, я так боялся. Я просто надеялся, что это будет более простой выход :) Я попробую его через некоторое время, а затем примите этот ответ, если он будет работать! Благодаря! –

+0

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

0

Если вы хотите использовать информацию из представления в контроллер снова быть уверены, чтобы сделать действие по HttpPost действия

так:

[HttpPost] 
public ActionResult MetaSearch(AdvancedSearchTerms term) 
{ 
//LOGIC 
} 
+0

Спасибо, но его там. Я только что удалил его по какой-то причине в представленном коде –

0

Его можно сделать, если модель содержит только простые свойства (нет коллекций или сложные О.Б. jects)

@using (Html.BeginForm("MetaSearch", "AdvancedSearch", Model, FormMethod.Post, null)) 

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

Редактировать

Кроме того, модель не может содержать свойство с тем же именем в качестве параметра маршрута. Например, если вы определили маршрут с url: "{controller}/{action}/{id}",, модель не может содержать свойство с именем ID.

1

Отправка одно значение Контроллер


Я буквально только что создавая «поиск» вариант/фильтра в моей форме; Используя что-то вроде:

Просмотр

@using (Html.BeginForm()) 
{ 
    <div> 
     <hr /> 
     Search 
     <hr /> 
     Name: @Html.TextBox("SearchString", null, new { @id = "thisID" })<a style="float:right; margin-top:8px" href="@Url.Action("Index", "ControllerName")"> 
     <br /> 
     <input type="submit" value="Filter" id="subBtn" /> 
     <hr /> 
    </div> 
} 

С моим кодом контроллер Бытии:

 [Authorize] 
     public ActionResult Index() 
     { 
      return View(db.Traders.ToList()); 
     } 

     [HttpPost] 
     public ActionResult Index(string searchString) 
     { 

      var traders = from m in db.Traders //db is my Database Entities 
         select m; 

      if (!String.IsNullOrEmpty(searchString)) 
      { 
       traders = traders.Where(s => s.Name.Contains(searchString)); 
      } 

      return View(traders); 
     } 

И поэтому мой контроллер получит это значение TextBox как часть метода.


Фильтрация Использование поиска и/или Combo коробки (оба или один или ни одного)


я использовал this site для реализации базовой системы поиска/фильтрации для моего проекта. Это помогло ТАК МНОГО.

Он использует ViewBag, чтобы вы могли создать comboBox, который затем вы можете выбрать и вернуть выбранное значение вашему методу действия [HttpPost] - отлично подходит для ваших нужд фильтрации/поиска!

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

Ваш метод действия может выглядеть следующим:

public ActionResult Index(string movieGenre, string searchString) 
{ 
    var GenreLst = new List<string>(); 

    var GenreQry = from d in db.Movies 
        orderby d.Genre 
        select d.Genre; 

    GenreLst.AddRange(GenreQry.Distinct()); 
    ViewBag.movieGenre = new SelectList(GenreLst); 

    var movies = from m in db.Movies 
       select m; 

    if (!String.IsNullOrEmpty(searchString)) 
    { 
     movies = movies.Where(s => s.Title.Contains(searchString)); 
    } 

    if (!string.IsNullOrEmpty(movieGenre)) 
    { 
     movies = movies.Where(x => x.Genre == movieGenre); 
    } 

    return View(movies); //returns movies matching results 
} 

Отправка полной модели к контроллеру


В плане помощи прохождения полный контроллер, вы можете найти this tutorial полезно, поскольку он создает основные действия CRUD («Создать» позволяет вам передать одну модель контроллеру).

В методе действий «Postback», вам нужно будет «связывать» эти данные, как:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student) 
{ 
//do stuff with this model 
return redirectToAction("Index"); 
} 

Это дополнительно описано в приведенной выше ссылке.

+0

Кажется идеальным для OPs Вопрос :) – jbutler483

+0

Что это касается вопроса? –

+0

OP реализует средство поиска (от имен переменных, в любом случае). Кроме того, он показывает/учит OP, как передавать данные из представления в контроллер, независимо от того, завершены или нет все поля (в противном случае ваша модель, возможно, потребуется изменить, чтобы разрешить значения NULL);) –