5

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

4

6 回答 6

9

将 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>
于 2016-05-14T20:33:59.940 回答
1

尝试这样的事情:

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;
            }
        }
    }
于 2013-11-02T13:17:21.587 回答
1

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

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

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

这些只是我见过的常见问题。您的问题可能有所不同,但我们需要查看您正在处理的问题才能分辨出来。

于 2013-10-31T02:54:18.970 回答
0

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

于 2013-11-01T17:49:22.063 回答
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 本身总是会要求那些

这就是“魔术”发生的地方——>如果查询字符串参数按名称匹配,MVC 会自动将查询字符串参数转换为可选的控制器参数

我也在为此寻找一个好的答案,--> ie - 一个不使用 qs 的那个用法,但找不到一个..

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

于 2014-02-19T01:28:56.000 回答
0

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

于 2013-11-02T04:46:54.643 回答