如何在MVC2中读取HttpPost中的TextArea值和模型

时间:2011-03-28 15:42:43

标签: c# asp.net-mvc-2

我是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 个答案:

答案 0 :(得分:2)

我认为以下内容应该有效:

[HttpPost]
public ActionResult ViewMyProducts(string MyTextArea)

有用的事情是在表单中明确调用您的Action - 通过更改此行:

<% using (Html.BeginForm())

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

确保“提交”操作将其重定向到正确的操作。

就模型而言:

如果您只是检查计数 - 您可以创建一个隐藏字段,返回“模型”中的项目数,如下所示:

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

但是如果你想要整个模型 - 它需要是这样的:

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

然后你可以进一步修改你的Action看起来像这样:

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

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

虽然您可以在Controller内部访问以刷新模型 - 因此,如果您不需要传回整个内容,您仍然可以通过重新调用来重新填充视图。

答案 1 :(得分:2)

字符串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 :(得分:0)

首先,您将item.name和item.date呈现为文本而不是html控件。因此,您将无法在控制器方法参数中接收它。