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


80

我对ASP.Net完全陌生,我确信这是一个非常基本的问题,我有一个View,其中有一个用于生成报告的链接,但为了能够生成报告,我必须要求用户提供适当的文本名称,例如好。

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

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

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

更新

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


用户必须发布一些内容-视图不直接知道如何与控制器通信。
Daniel A. White

如果您阅读Microsoft文档,您会发现它没有解释如何执行此操作。
保罗麦卡锡,

Answers:


131

您可以使用ViewModels来实现,就像您如何从控制器传递数据到视图一样。

假设您有一个这样的viewmodel

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

在您的GET Action中,

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

@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(无模型)中,有没有一种方法可以指定控制器名称?因为应接收此信息请求的控制器比该视图的控制器不同..
艾哈迈德

@Ahmed:检查更新的答案。您可以使用BeginForm方法的特定重载。
2013年

4
优秀,感谢你的伟大的答案..
艾哈迈德

很好,我已经找了几个小时了。谢谢!
Dan Beaulieu

谢谢!!答案很明确。就我而言,在HttpPost操作中,我不需要使用与文本框名称相同的参数。仅将模型对象作为参数,我就能检索到值。
Hnin Htet Htet Aung

27

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

@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

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

控制器:

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

1
<input type =“ valueINeed” type =“ text”>应为<input name =“ valueINeed” type =“ text”>
GregH 2015年

谢谢 更新了响应。
Azure SME
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.