我是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”的值。我怎么能得到它们?我会感激任何帮助。
答案 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控件。因此,您将无法在控制器方法参数中接收它。