Как прочитать значение TextArea и модель в HttpPost в MVC2 - PullRequest
1 голос
/ 28 марта 2011

Я новичок в MVC2, извините за глупый вопрос.Я искал хороший ответ, но не могу его найти.Поэтому мой вопрос:

У меня есть вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MyProject.MyDB.MyProducts>>" %>
<%@ Import Namespace="MyProject.MyDB" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Content" runat="server">
    <% using (Html.BeginForm())
       {%>
    <table>        
        <%
            foreach (var item in Model)
            {%>
        <tr>
            <td>
                <%:item.name%>
            </td>
            <td>
                <%:String.Format("{0:g}", item.date)%>
            </td>
        </tr>
        <% } %>
    </table>
    <div>
        <%:Html.TextArea("MyTextArea")%>
    </div>    
    <p>
        <input type="submit" value="Send" />
    </p>
    <% } %>
</asp:Content>

Мой контроллер:

[HttpGet]
public ActionResult ViewMyProducts(int id)
{
        List<MyProducts> myModel = GetMyProducts(id);
        return View(myModel);
    }

    [HttpPost]
    public ActionResult ViewMyProducts(/*???What should I put here???*/)
    {
        if(/*I want "MyTextArea" value here*/ == something && myModel/*from view*/.count==5}
        {
            //do something
        }
        return View(myModel);
    }

Итак, в HttpPost мне нужен myModel из вида и значениеMyTextArea "из поля зрения.Как я могу получить их ??Я буду признателен за любую помощь.

Ответы [ 3 ]

2 голосов
/ 28 марта 2011

string myTextArea - или вы можете просто проверить FormCollection (я бы порекомендовал именованную переменную).

Если вы хотите вернуть модель из представления, вам нужно будет также сериализовать ее, чтобы вернуть значения. Если это так, я бы преобразовал все это в модель представления, которая либо наследуется от вашей Модели, либо имеет открытое свойство, являющееся вашей моделью, добавит свойство для MyTextArea, а затем выдаст скрытые входные данные для вашей модели, названные для соответствующей свойства. Предполагая, что ваша модель где-то сохраняется (база данных), я бы просто передал ключ (id) и повторно выполнил гидратацию объекта в результате действия.

   [HttpPost]
    public ActionResult ViewMyProducts(ViewMyProductsViewModel viewModel)
    {
        if(viewModel.MyTextArea == "something" && (IEnumerable<foo>)myModel).Count()==5))         {
          var model = repo.Get(myModel.First().Id);
          // do something with the model
        }
        return View(viewModel);
    }



<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MyProject.MyDB.MyProducts>>" %>
<%@ Import Namespace="MyProject.MyDB" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Content" runat="server">
    <% using (Html.BeginForm())
       {%>
    <table>        
        <%
            foreach (var item in Model)
            {%>
        <tr>
            <td>
                <input type="hidden" name="viewModel.Id" value="<%:item.id%>" />
                <%:item.name%>
            </td>
            <td>
                <%:String.Format("{0:g}", item.date)%>
            </td>
        </tr>
        <% } %>
    </table>
    <div>
        <%:Html.TextArea("MyTextArea")%>
    </div>    
    <p>
        <input type="submit" value="Send" />
    </p>
    <% } %>
</asp:Content>
2 голосов
/ 28 марта 2011

Я думаю, что должно работать следующее:

[HttpPost]
public ActionResult ViewMyProducts(string MyTextArea)

Полезно было бы явно вызвать ваше Действие в вашей Форме - изменив эту строку:

<% using (Html.BeginForm())

до

<% using (Html.BeginForm("ViewMyProducts","ControllerName",HttpMethod.Post))

, чтобы гарантировать, что действие Submit перенаправляет его на правильное действие.

Что касается модели:

Если вы просто проверяете счетчик - вы можете создать скрытое поле, которое возвращает количество элементов в «Модели», например:

<%: Html.Hidden("modelCount", Model.Count());

но если вам нужна вся Модель - это должно быть что-то вроде этого:

<%: Html.Hidden("myModel", Model);

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

ViewMyProducts(string MyTextArea, int modelCount)
{
    //...
}

или

ViewMyProducts(string MyTextArea, IEnumerable<MyProject.MyDB.MyProducts> myModel)
{
    //...
}

Хотя у вас есть доступ внутри контроллера для обновления модели - поэтому, если вам не нужно было возвращать всю вещь назад, вы все равно можете заново заполнить свой взгляд новым вызовом.

0 голосов
/ 28 марта 2011

Прежде всего, вы отображаете item.name и item.date как текст, а не html-элемент управления. Поэтому вы не сможете получить его в параметрах метода контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...