【问题标题】:html form posting to mvc controllerhtml 表单发布到 mvc 控制器
【发布时间】:2013-11-10 21:55:51
【问题描述】:

我正在尝试设置一个简单的登录 html 页面,该页面的操作被发送到我另一个站点上的 mvc 控制器。我设置页面来发布帖子没有问题,并且在 mvc 控制器中我有我的方法来读取表单帖子。问题是我没有从表单集合中的 html 表单中看到我的字段。

在 mvc 控制器方法中读取表单帖子是否需要做一些特别的事情,如果是,那是什么?


这是我页面中的表单操作标记

<form action="http://reconciliation-local.sidw.com/login/launch" method="post">
    User Name <input type="text" id="username"/><br/>
    Password <input type="text" id="password"/>
    <input type="submit" value="launch"/>


</form>

控制器方法

    [HttpPost]
    public ActionResult launch(FormCollection fc)
    {
        foreach (string fd in fc)
        {
            ViewData[fd] = fc[fd];
        }
        return View();
    }

当我单步执行控制器方法代码时,我在 formcollection 参数中看不到任何内容。

【问题讨论】:

  • 请显示您的表单代码。
  • 同时显示你的控制器方法。

标签: c# html asp.net-mvc asp.net-mvc-4


【解决方案1】:

将 Html 发布到 MVC 控制器

  1. 使用表单创建 HTML 页面(不要忘记引用 Jquery.js)

    <form id="myform" action="rec/recieveData" method="post">
    
        User Name <input type="text" id="username" name="UserName" /><br />
        Password  <input type="text" id="password" name="Password"/>
                  <input type="submit" id="btn1" value="send" />
    </form>
    
    <script>
        $(document).ready(function () {
    
             //get button by ID
            $('#btn1').submit(function () {
    
                //call a function with parameters
                $.ajax({
                    url: 'rec/recieveData',  //(rec)= Controller's-name 
                                             //(recieveData) = Action's method name
                    type: 'POST',
                    timeout: '12000', (optional 12 seconds)
                    datatype: 'text',
                    data: {
                        //Get the input from Document Object Model
                        //by their ID
                        username: myform.username.value,  
                        password: myform.password.value,
                    }
    
                });
            });
        });
    
    </script>
    

然后在 MVC 控制器中

                         controller/action
                             |        |

1。创建名为rec(rec/recieveData)的Controller

  1. 创建名为 rec.cshtml 的视图

这是控制器:

 public class recController : Controller
    {
        // GET: rec
        string firstname = "";
        string lastname = "";

        List<string> myList = new List<string>();

        public ActionResult recieveData(FormCollection fc)
        {
          //Recieve a posted form's values from  parameter fc
            firstname = fc[0].ToString(); //user
            lastname = fc[1].ToString();  //pass

           //optional: add these values to List
            myList.Add(firstname);
            myList.Add(lastname);

            //Importan:
            //These 2 values will be return with the below view
            //using ViewData[""]object...
            ViewData["Username"] = myList[0];
            ViewData["Password"] = myList[1];

            //let's Invoke view named rec.cshtml
            // Optionaly we will pass myList to the view
            // as object-model parameter, it will still work without it thought
            return View("rec",myList);
        }
    }

这是视图:

@{
    ViewBag.Title = "rec";
}

<h2>Hello from server</h2>

<div>
    @ViewData["Username"]<br /> <!--will display a username-->
    @ViewData["Password"] <!-- will display a password-->

</div>

【讨论】:

    【解决方案2】:

    如果您发布了一些代码,它会更容易为您提供帮助,所以请编辑您的问题...

    确保您的表单操作具有正确的地址,您的方法指定 POST (method="POST") 并且表单下的输入字段具有指定的名称属性。

    在服务器端,尝试将您的唯一参数设为 FormCollection 并测试表单中的字段是否通过调试器发布。也许您的模型绑定不正确,FormCollection 至少会显示发布的内容(如果有的话)。

    这些只是我见过的常见问题。您的问题可能有所不同,但我们需要了解您正在处理的问题。

    【讨论】:

      【解决方案3】:

      试试这样的:

      cQuery _aRec = new cQuery();
          _aRec.Sqlstring = "SELECT * FROM Admins";
          DataSet aDS = _aRec.SelectStatement();
          DataTable aDT = aDS.Tables[0];
          foreach (DataRow aDR in aDT.Rows){
              if (txtAdminUsername.Text == aDR[0].ToString()){
                  if (txtAdminPassword.Text == aDR[1].ToString()){
                      Session["adminId"] = aDR[0];
                      Response.Redirect("Admin.aspx");
                      return;
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        确保正确定义了用户名和密码的 FormCollection 对象属性。

        【讨论】:

        • 想通了.....不确定为什么这很重要,但是在表单标签上,我需要对字段名使用 name 属性而不是 id 属性。做出改变,嘿,它很快就通过了……去想一想。 :)
        • 有道理。我相信这就是控制器绑定到表单字段的方式。
        • 你是对的。为了解决这个问题,您必须创建自己的编辑器模板。
        【解决方案5】:

        我不得不在文本标签上使用 name 属性,这解决了我的问题,现在就像一个魅力。

        【讨论】:

          【解决方案6】:

          你必须使用 Ajax 来做到这一点。每当你想从客户端“提交”时,你应该使用 Ajax 来更新服务器


          第 1 步 - 您将 Ajax 调用重定向到您的操作,但附加了查询字符串中的参数列表

          $.ajax(url: url + "?" + your_query_string_parameter_list_you_want_to_pass)
          

          第 2 步 - 将可选参数添加到您希望客户端返回的名称和类型相同的控制器操作中

          public ActionResult MyControllerAjaxResponseMethod(type1 para1 = null, 
                                                             type2 para2 = null, 
                                                             type3 para3 = null, ..)
          

          知道可选参数必须被初始化,否则Action本身总是会要求那些

          这就是“魔法”发生的地方 --> MVC 会自动将查询字符串参数转换为您的可选控制器参数(如果它们按名称匹配)

          我也在为此寻找一个好的答案,--> 即 - 一个不使用 q-s 进行该用途的答案,但找不到一个..

          有点道理,但除了通过网址之外,你不能以任何其他方式做到这一点..

          【讨论】:

            猜你喜欢
            • 2018-09-19
            • 1970-01-01
            • 2015-08-12
            • 1970-01-01
            • 2012-09-08
            • 1970-01-01
            • 1970-01-01
            • 2016-10-03
            • 2012-05-10
            相关资源
            最近更新 更多