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

C# 如何在MVC2中读取HttpPost中的TextArea值和模型,c#,asp.net-mvc-2,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="MyP

我是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);
    }
[HttpGet]
公共操作结果ViewMyProducts(int id)
{
List myModel=GetMyProducts(id);
返回视图(myModel);
}
[HttpPost]
公共行动结果视图我的产品(/*??我应该在这里放什么??*/)
{
如果(/*我希望此处的“MyTextArea”值*/==something&&myModel/*from view*/.count==5}
{
//做点什么
}
返回视图(myModel);
}

因此,在HttpPost中,我需要视图中的myModel和视图中的“MyTextArea”的值。我如何获得它们?我将非常感谢任何帮助。

我认为以下方法应该有效:

[HttpPost]
public ActionResult ViewMyProducts(string MyTextArea)
一个有用的方法是以您的形式显式调用您的操作-通过更改以下行:

<% using (Html.BeginForm())

ViewMyProducts(字符串MyTextArea,IEnumerable myModel)
{
//...
}

尽管您可以访问控制器内部以刷新模型-因此,如果您不需要传回整个内容,您仍然可以通过一个新调用重新填充视图。

我认为以下方法应该可以工作:

[HttpPost]
public ActionResult ViewMyProducts(string MyTextArea)
一个有用的方法是以您的形式显式调用您的操作-通过更改以下行:

<% using (Html.BeginForm())

ViewMyProducts(字符串MyTextArea,IEnumerable myModel)
{
//...
}

尽管您可以在控制器内部访问以刷新模型-因此,如果不需要传回整个内容,您仍然可以使用新调用重新填充视图。

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>
[HttpPost]
公共行动结果ViewMyProducts(ViewMyProductsViewModel viewModel)
{
if(viewModel.MyTextArea==“something”&(IEnumerable)myModel.Count()==5)){
var model=repo.Get(myModel.First().Id);
//对模型做些什么
}
返回视图(viewModel);
}


字符串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>
[HttpPost]
公共行动结果ViewMyProducts(ViewMyProductsViewModel viewModel)
{
if(viewModel.MyTextArea==“something”&(IEnumerable)myModel.Count()==5)){
var model=repo.Get(myModel.First().Id);
//对模型做些什么
}
返回视图(viewModel);
}


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

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

[HttpPost]公共操作结果ViewMyProducts(字符串MyTextArea){………}??????????而我的模型呢?尽管我尽量避开隐藏的字段,但我还是不断地回到它们:)。我尝试过你的解决方案:我有点害怕发生这种情况——因为我不知道你是否能够传回你的整个模型——仅仅是因为MVC的工作方式。您最好的选择可能是使用另一种存储方法来保持模型的活力。您是否考虑过将其存储在Session/ViewData/TempData中,然后在发布后访问它?是的,Rionmonster做得很好!Session完成了任务,最重要的是,我没有使用Hidden。伟大的感谢大家的快速回答。[HttpPost]公共操作结果ViewMyProducts(字符串MyTextArea){………}??????????而我的模型呢?尽管我尽量避开隐藏的字段,但我还是不断地回到它们:)。我尝试过你的解决方案:我有点害怕发生这种情况——因为我不知道你是否能够传回你的整个模型——仅仅是因为MVC的工作方式。您最好的选择可能是使用另一种存储方法来保持模型的活力。您是否考虑过将其存储在Session/ViewData/TempData中,然后在发布后访问它?是的,Rionmonster做得很好!Session完成了任务,最重要的是,我没有使用Hidden。伟大的谢谢大家的快速回答。我正在努力避免在HttpPost中再次接触DB。看来
ViewMyProducts(string MyTextArea, IEnumerable<MyProject.MyDB.MyProducts> myModel)
{
    //...
}
   [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>