html表单发布到mvc控制器

时间:2013-10-31 02:14:24

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

我正在尝试设置一个简单的登录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参数中没有看到任何内容。

6 个答案:

答案 0 :(得分:6)

将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>
    

  2. 然后在MVC控制器

                             controller/action
                                 |        |
    

    1。创建名为rec(rec / recieveData)的控制器

    1. 创建名为rec.cshtml的视图
    2. 以下是控制器:

       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>
      

答案 1 :(得分:1)

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

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

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

这些只是我见过的常见问题。您的问题可能会有所不同,但我们需要了解您正在使用的内容才能告诉您。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

尝试这样的事情:

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;
            }
        }
    }

答案 5 :(得分:0)

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


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

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

步骤2 - 向Controller-action添加可选参数,其中包含您希望客户端返回的相同名称和类型

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

知道必须初始化可选参数,否则Action本身将始终要求那些

这是“神奇”发生的地方 - &gt;如果查询字符串参数按名称

匹配,它将自动将查询字符串参数转换为可选的控制器参数

我也在寻找一个好的答案, - &gt;即 - 一个不使用q-s进行该用法,但找不到一个......

有点理智你不能以任何其他方式去做,除了通过网址..