【问题标题】:how to pass data from view to controller如何将数据从视图传递到控制器
【发布时间】:2014-06-02 21:52:52
【问题描述】:

我是 asp.net MVC5 的新手,我正在尝试将数据作为字符串从视图传递到控制器。 这是控制器类:

namespace Movies.Controllers
{
    public class HelloWorldController : Controller
    {
        // GET: HelloWorld

        public ActionResult Index()
        {
            return View();
        }
        [HttpPost]
        public ActionResult welcome(FormCollection fc, string reportName)
        {
            ViewBag.Message = reportName;
            return View();
        }
    }
}

这是索引视图:

@{
    ViewBag.Title = "MVC Movies";
}
<h2>My Movies List</h2>

<p>Hellow from our view template</p>
@using (Html.BeginForm("Welcome", "HelloWorld", FormMethod.Get))
{

    <p>
        <input type="text" name="reportName" />
        <input type="submit" />

    </p>
}

欢迎观看:

@{
     Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>welcome</h2>
@{
    ViewBag.Title = "Welcome";
}
<ul>
    @for (int i = 0; i < 2; i++)
    {
        <li>@ViewBag.Message</li>
    }
</ul>

实际上,我的 Index 方法正在传递一个视图,该视图将在表单中包含一个用于字符串的文本框,然后在单击提交按钮时,应用程序应该在同一个控制器的 Welcome 方法中传递该字符串。单击提交按钮时,浏览器显示一个找不到资源的窗口。

有什么问题..?谢谢你的时间..:)

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    1) 动作名称区分大小写,您在表单定义中使用“Welcome”,但动作名称必须为“welcome”且w小写。

    2) 您的表单正在执行 GET,但您在操作中指定了 POST

        [HttpGet]
        public ActionResult welcome(FormCollection fc, string reportName)
        {
            ViewBag.Message = reportName;
            return View();
        }
    

    【讨论】:

    • 你说得对,因为我的错误是我在 beginform 中使用了 get insted of ost。但是当我在点击提交按钮时发布数据时,它怎么能在那里 httpget。当用户将数据从视图发布到控制器时,httppost 将起作用.. 这里 httpget.. 有什么好处?
    • @MudasirRao 如果您使用 GET 表单,数据将不会在请求正文中提交,而是作为附加到请求 URL 的查询字符串参数。在您的情况下,请求看起来像 /HelloWorld/Welcome?reportName=somename
    • 我也可以这样操作...@using (Html.BeginForm("Index","Movies",FormMethod.Get))
    【解决方案2】:

    在您的 beginform 中将 FormMethod.Get 替换为 FormMethod.Post

    【讨论】:

      【解决方案3】:

      修改 FormMethod.Get 为 FormMethod.Post:

      @using (Html.BeginForm("Welcome", "HelloWorld", FormMethod.Post))
      {
      
          <p>
              <input type="text" name="reportName" />
              <input type="submit" />
      
          </p>
      }
      

      将您的操作实现更改为:

          [HttpPost]
          public ActionResult welcome(FormCollection fc)
          {
              ViewBag.Message = fc["reportName"];
              return View();
          }
      

      但是,我强烈建议您为表单创建一个视图模型并使用它而不是 FormCollection。

      【讨论】:

      • Barisa 谢谢你的回答..我想通了......你能解释一下视图模型相对于表单收集的好处吗..?
      • 使用视图模型,您不必手动从 FormCollection 中取出值 - 只要您的视图模型中的属性名称与表单上的输入字段。此外,您可以使用数据注释来注释视图模型上的属性并获得验证(检查 RequiredAttribute 即)。
      • Barisa 你的意思是说我可以直接将值从视图(V)到模型(M),然后我可以将它们保存在数据库中......?
      • 但我将值传递给控制器​​以渲染另一个视图。在这种情况下,我不能涉及模型。我对吗..?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2013-05-20
      • 1970-01-01
      相关资源
      最近更新 更多