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

89

我完全不了解ASP.Net,但我知道这是一个非常基本的问题。我有一个View,在其中有一个链接用于生成报告,但为了能够生成报告,我必须要求用户提供合适的文本名称。

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

在这种情况下,我只需要从视图传递一个字符串到控制器。

任何带有示例的建议都将不胜感激。

更新

我明白我必须将数据发送回服务器,但razorhtml代码和控制器应该如何实现?


用户必须发布一些内容 - 视图不直接知道如何与控制器通信。 - Daniel A. White
如果你阅读微软的文档,你会发现它并没有解释如何做到这一点。 - Paul McCarthy
3个回答

146

您可以像从控制器传递数据到视图一样,使用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
}

或者,你可以不使用POCO类(视图模型)来完成这个操作。

@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方法的此重载

@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" />
}

在您提供的选项/方法2中(没有模型),是否有一种指定控制器名称的方法?因为应该接收此POST请求的控制器与此视图的控制器不同。 - Ahmed
@Ahmed:请查看更新后的答案。你可以使用特定的 BeginForm 方法重载。 - Shyju
4
非常好,感谢您的精彩回答。 - Ahmed
很好,我已经找了几个小时了。谢谢! - Dan Beaulieu
谢谢!非常清晰的答案。对于我的情况,在HttpPost操作中,我不需要使用与文本框名称相同的参数。只需将模型对象作为参数放入即可检索值。 - Hnin Htet Htet Aung
可以使用Ajax post方法将数据发送到操作。此外,还可以查看以下链接以了解各种发布数据的方式http://www.c-sharpcorner.com/UploadFile/3d39b4/getting-data-from-view-to-controller-in-mvc/。 - kumar chandraketu

35

如果您不想或不需要发布:

@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,但最好始终同时指定两者。

4
给那些看到这个简单答案的人提供信息,包含路由值[ new { reportID = 1 }]后面要加上 null ,否则它会尝试将它们作为 htmlAttributes 处理,而它们将无法传递。 - Hardycore

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

控制器:

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

2
<input type="valueINeed" type="text"> 应该改为 <input name="valueINeed" type="text">。 - GregH
谢谢。已更新回复。 - Andy T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接