ASP.Net MVC如何将数据从视图传递到控制器

时间:2013-12-02 16:28:39

标签: asp.net asp.net-mvc

我是ASP.Net的新手,我相信这是一个非常基本的问题 我有一个视图,其中有一个生成报告的链接,但为了能够生成报告,我必须要求用户提供合适的文本名称。

到目前为止,我已经能够使用从我的控制器传递的模型将数据从服务器传递到视图,但我不确定如何将数据从视图传递到我的控制器。

在这种情况下,我只需要将视图中的字符串传递给控制器​​。

任何有关示例的建议都将受到赞赏。

更新

我知道我必须将数据发布回服务器,但是如何以razorhtml代码和控制器的形式实现?

3 个答案:

答案 0 :(得分:110)

您可以使用ViewModels,例如如何将数据从控制器传递到视图。

假设你有一个像这样的视图模型

public class ReportViewModel
{
   public string Name { set;get;}
}

并在你的GET动作中,

public ActionResult Report()
{
  return View(new ReportViewModel());
}

并且您的观点必须强烈输入ReportViewModel

@model ReportViewModel
@using(Html.BeginForm())
{
  Report NAme : @Html.TextBoxFor(s=>s.Name)
  <input type="submit" value="Generate report" />
}

以及控制器中的 HttpPost 操作方法

[HttpPost]
public ActionResult Report(ReportViewModel model)
{
  //check for model.Name property value now
  //to do : Return something
}

OR 简单地说,您可以在没有POCO类(Viewmodels)的情况下执行此操作

@using(Html.BeginForm())
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

并在您的HttpPost操作中,使用与文本框名称相同的参数。

[HttpPost]
public ActionResult Report(string reportName)
{
  //check for reportName parameter value now
  //to do : Return something
}

编辑 根据评论

如果要发布到另一个控制器,可以使用BeginForm方法的this overload

@using(Html.BeginForm("Report","SomeOtherControllerName"))
{
   <input type="text" name="reportName" />
   <input type="submit" />
}

将数据从操作方法传递到视图?

您可以使用相同的视图模型,只需在GET操作方法中设置属性值

public ActionResult Report()
{
  var vm = new ReportViewModel();
  vm.Name="SuperManReport";
  return View(vm);
}

并在您的视图中

@model ReportViewModel
<h2>@Model.Name</h2>
<p>Can have input field with value set in action method</p>
@using(Html.BeginForm())
{
  @Html.TextBoxFor(s=>s.Name)
  <input type="submit" />
}

答案 1 :(得分:24)

如果您不想/需要发布:

@Html.ActionLink("link caption", "actionName", new { Model.Page })  // view's controller
@Html.ActionLink("link caption", "actionName", "controllerName", new { reportID = 1 }, null);

[HttpGet]
public ActionResult actionName(int reportID)
{

请注意,新{}部分中的reportID与动作参数中的reportID匹配,您可以通过这种方式添加任意数量的参数,但任何超过2或3(有些人总是会争辩)您应该通过模型传递POST(按照其他答案)

编辑:为注释中指出的正确重载添加了null。有许多重载,如果你同时指定action + controller,那么你需要routeValues和htmlAttributes。如果没有控制器(只是标题+动作),只需要routeValues,但最好始终指定两者。

答案 2 :(得分:16)

<form action="myController/myAction" method="POST">
 <input type="text" name="valueINeed" />
 <input type="submit" value="View Report" />
</form> 

控制器:

[HttpPost]
public ActionResult myAction(string valueINeed)
{
   //....
}