ASP.NET MVC2: получение данных текстового поля из представления в контроллер - PullRequest
0 голосов
/ 08 апреля 2010

У меня проблемы с получением данных из текстового поля в контроллер. Я прочитал о нескольких способах достижения этой цели в книге Сандерсона Pro ASP.NET MVC Framework, но не добился успеха.

Кроме того, я натолкнулся на несколько похожих вопросов в Интернете, но там тоже не добился успеха. Похоже, я упускаю что-то довольно фундаментальное.

В настоящее время я пытаюсь использовать подход параметров метода действия. Может кто-нибудь указать, где я иду не так или привести простой пример? Заранее спасибо!

Использование Visual Studio 2008, ASP.NET MVC2 и C #: Я хотел бы взять данные, введенные в текстовое поле «Исследователь», и использовать их для фильтрации следователей в контроллере. Я планирую сделать это в методе List (который уже работает), однако я использую метод SearchResults для отладки.

Вот код текстового поля, на мой взгляд, SearchDetails:

    <h2>Search Details</h2>

 <% using (Html.BeginForm()) { %> 
 <fieldset>
     <%= Html.ValidationSummary() %>
     <h4>Investigator</h4>
     <p>
        <%=Html.TextBox("Investigator")%>
        <%= Html.ActionLink("Search", "SearchResults")%>
     </p>
  </fieldset>
 <% } %>

Вот код моего контроллера, InvestigatorsController:

    private IInvestigatorsRepository investigatorsRepository;
    public InvestigatorsController(IInvestigatorsRepository investigatorsRepository)
    {

        //IoC:
        this.investigatorsRepository = investigatorsRepository;
    }

    public ActionResult List()
    {
        return View(investigatorsRepository.Investigators.ToList());
    }

    public ActionResult SearchDetails()
    {
        return View();
    }

    public ActionResult SearchResults(SearchCriteria search)
    {
        string test = search.Investigator;

        return View();
    }

У меня есть класс следователя:

    [Table(Name = "INVESTIGATOR")]
public class Investigator
{
    [Column(IsPrimaryKey = true, IsDbGenerated = false, AutoSync=AutoSync.OnInsert)]
    public string INVESTID { get; set; }

    [Column] public string INVEST_FNAME { get; set; }
    [Column] public string INVEST_MNAME { get; set; }
    [Column] public string INVEST_LNAME { get; set; }
}

и создал класс SearchCriteria, чтобы посмотреть, смогу ли я заставить MVC выдвинуть в него данные критериев поиска и захватить их в контроллере:

    public class SearchCriteria
{
    public string Investigator { get; set; }
}

} * * тысяча двадцать-один

Я не уверен, что компоновка проекта также имеет какое-либо отношение к этому, но я использую подход с тремя проектами, предложенный Sanderson: DomainModel, Tests и WebUI. Классы Investigator и SearcCriteria находятся в проекте DomainModel, а другие элементы, упомянутые здесь, находятся в проекте WebUI.

Еще раз спасибо за любые подсказки, советы или простые примеры!

Mike

Ответы [ 4 ]

1 голос
/ 08 апреля 2010

Это должно сделать это для вас (не в состоянии убедиться, что это идеально - набрано это по памяти):

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult SearchDetails(FormCollection formValues)
{
    var txtContents = formValues["Investigator"];

    // do stuff with txtContents

    return View();
}
1 голос
/ 08 апреля 2010

1.) Вы смотрели на ViewModels для своего View? По сути, это и есть ваш класс SearchCriteria. Убедитесь, что вы строго набрали свой взгляд с этой моделью:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/MyMaster.Master" Inherits="System.Web.Mvc.ViewPage<SearchCritieria>"
  1. Также убедитесь, что вы используете метод HtmlHelper.TextBoxFor для сопоставления этого свойства Investigator с моделью SearchCritiera. При отправке обратно ваше текстовое поле должно быть там:

    '<% = Html.TextBoxFor (model => model.Invesigator)%>'

Удачи!

Также вот отличная справка по использованию ViewModels, на которую я недавно много смотрел:

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

0 голосов
/ 09 апреля 2010

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

До этого работали:

  1. Используйте кнопку отправки
  2. Используйте этот код для формы:

    <% using(Html.BeginForm(new { Action = "SearchResults"})) { %> <% } >
    

Еще раз спасибо за вашу помощь!

Mike

0 голосов
/ 08 апреля 2010

попробуйте строго набрать страницу, чтобы использовать SearchCriteria для автоматического размещения таких данных, например:

public partial class Search: ViewPage<SearchDetails>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...