从View传递到Controller的字符串变量在Controller中始终以NULL到达

时间:2019-05-13 10:32:29

标签: c# ajax model-view-controller

我想通过Ajax调用将数据从View传递到Controller。 以下简化代码每次都会传递NULL。 有人可以建议我做错了吗?

Index.cshtml:

<input type="submit" id="ajaxTestButton" value="Pass To Controller" />

@section scripts {
    <script type="text/javascript">

        var testData = "Fred";

        $("#ajaxTestButton").click(function () {
            $.ajax({
                type: "POST",
                dataType: "text",
                data: testData,
                contentType: "text/plain",
                url: '@Url.Action("ButtonTest", "Home")'
            });
    });
    </script>

HomeController.cs:

namespace TestingAjax.Controllers
{
    public class HomeController : Controller
    {
        [HttpPost]
        public void ButtonTest(string Name)
        {
            // Do something interesting here.
        }

        public IActionResult Index()
        {
            return View();
        }
    }
}

我期望字符串名称为“ Fred”。 谢谢。

4 个答案:

答案 0 :(得分:1)

使用Formdata传递json数据,现在您在控制器中创建GET和POST操作。

    <input type="submit" id="ajaxTestButton" value="Pass To Controller" />

@section scripts {
<script type="text/javascript">
        var formData = new FormData();
        formData.append("Name", "fred");

        $("#ajaxTestButton").click(function () {
        $.ajax({
            type: "POST",
            dataType: 'json',
            data: formData,
            processData: false,
            contentType: false,
            url: '@Url.Action("ButtonTest", "Home")'
        });
});
</script>

答案 1 :(得分:1)

<input type="submit" id="ajaxTestButton" value="Pass To Controller" />

@section scripts {
    <script type="text/javascript">

        var testData = "Fred";

        $("#ajaxTestButton").click(function () {
            $.ajax({
                type: "POST",
                dataType: "text",
                data: { 'Name': testData },
                contentType: "text/plain",
                url: '@Url.Action("ButtonTest", "Home")'
            });
    });
    </script>

答案 2 :(得分:0)

推荐的方法是序列化表格。

请记住,在控制器操作中将使用您的表单类型。 如果您的表单类型为MyViewModel,它将是控制器操作上期望的类型,那么这是一种很好的方法。所有属性都将被序列化并映射。

@section scripts {
    <script type="text/javascript">

        $("#ajaxTestButton").click(function () {
            var form = $('form');
        $.ajax( {
              type: "POST",
              url: form.attr( 'action' ),
              data: form.serialize(),
              success: function( response ) {
                console.log( response );
              }
            } );

    });
    </script>

答案 3 :(得分:0)

为了使用AJAXPOST表单变量到控制器来实现所需的功能,请参考以下代码片段:

<input type="submit" id="ajaxTestButton" value="Pass To Controller" />

@section scripts {
<script type="text/javascript">
        var yourName= "Fred";
        var json = {
                   Name: yourName
                   };

        $("#ajaxTestButton").click(function () {
        $.ajax({
            url: '@Url.Action("ButtonTest", "Home")',
            type: "POST",
            dataType: "json",
            data: { "json": JSON.stringify(json) },
            success: function (data) {
             //If there is no error from the server
             },
             error: function (data) {
             //If there is an error from the server
             },
        });
});
</script>

在您的控制器中,您可以像这样获得价值:

using System.Web.Script.Serialization;
namespace TestingAjax.Controllers
{
    public class HomeController : Controller
    {
        [HttpPost]
        public void ButtonTest(string json)
        {
            var serializer = new JavaScriptSerializer();
            dynamic jsondata = serializer.Deserialize(json, typeof(object));
            //Get your Name variable here
            string name= jsondata["Name"];
            // Do something interesting here.
        }

        public IActionResult Index()
        {
            return View();
        }
    }
}