如何将js变量发送到mvc控制器

Posted

技术标签:

【中文标题】如何将js变量发送到mvc控制器【英文标题】:How to send js variables to mvc controller 【发布时间】:2014-03-17 21:47:09 【问题描述】:

我是客户端-服务器编程概念的新手。我需要什么,将四个 js 变量发送到我的 MVC 3 控制器操作。

    $(document).ready(function() 
        var $jcrop;

        $('#image').Jcrop(
            bgColor: 'red',
            onSelect: refreshData
        , function () 
            $jcrop = this;
        );

        function refreshData(selected) 
            myData = 
                x1: selected.x1,
                x2: selected.x2,
                y1: selected.y1,
                y2: selected.y2
            ;
        
    );

所以我在浏览器中获取了我的变量。

我在服务器端拥有的是:

    public ActionResult CreateCover(ImageCoordinates coordinates) 
        ViewData.Model = coordinates;
        return View();
    

public class ImageCoordinates

    public int x1  get; set; 
    public int x2  get; set; 
    public int y1  get; set; 
    public int y2  get; set; 

有没有一种简单的方法可以将我的四个参数从 js 发布到我的操作中? 我尝试使用该站点中的几个示例,使用 $.ajax

这样

        $.ajax(
            url: '/dashboard/createcover',
            type: 'POST',
            data: JSON.stringify(myData),
            contentType: 'application/json; charset=utf-8',
            success: function (data) 
                alert(data.success);
            ,
            error: function () 
                alert("error");
            ,
            async: false
        );

但它不起作用,我收到了 0 0 0 0 在我的行动。但老实说,我什至不知道如何调用这个 jquery 函数。我应该通过单击按钮调用它,还是在我发布表单时自动调用它? 还有其他方法可以发送此参数吗?

【问题讨论】:

【参考方案1】:

在您不想使用 AJAX 或想要快速解决的情况下,您也可以尝试添加隐藏字段,然后使用 javascript(JS) 填充该隐藏字段中的值。

    @html.HiddenFor(m=>Model.ImageCoordinates.x1)
    <button type="submit">Submit Coordinates</button>

这将在 html 端生成一个 id ="ImageCoordinates_x1" 的“输入”标签 然后用JS

function refreshData(selected) 
            myData = 
                x1: selected.x1,
                x2: selected.x2,
                y1: selected.y1,
                y2: selected.y2
            ;
            return myData;
           


let coordinateData = refreshData(selected)
let x1 = document.getElementById("ImageCoordinates_x1");
x1.value = coordinateData .x1;

您现在可以通过它将 x1 坐标信息发送到服务器。要将数据发送到其他坐标,您必须为它们创建隐藏表单并使用 JS 填充输入标签的值

【讨论】:

【参考方案2】:

这里有解决方案 -

型号 -

public class ImageCoordinates

    public int x1  get; set; 
    public int x2  get; set; 
    public int y1  get; set; 
    public int y2  get; set; 

动作 -

    public ActionResult CreateCover(ImageCoordinates coordinates)
    
        return null;
    

让我们创建一个视图,该视图将对 Action 进行 AJAX 调用。

<script src="~/Scripts/jquery-1.10.2.min.js"></script>

<script>
    function submitForm() 

        var model = new Object();
        model.x1 = 120;
        model.y1 = 240;
        model.x2 = 360;
        model.y2 = 480;


        jQuery.ajax(
            type: "POST",
            url: "@Url.Action("CreateCover")",
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            data: JSON.stringify( coordinates: model ),
            success: function (data) 
                alert(data);
            ,
            failure: function (errMsg) 
                alert(errMsg);
            
        );
    
</script>

<input type="button" value="Click" onclick="submitForm()" />

输出 -

【讨论】:

突出显示最重要的部分“数据:JSON.stringify(坐标:模型),” 谢谢,我对此进行了测试,并在我的控制器操作中收到了变量。另一个问题是,如何使用我收到的参数呈现另一个视图。 public ActionResult CreateCover(ImageCoordinates 坐标) ViewData.Model = 坐标;返回视图();这是我的视图代码,但我仍然在我发送参数的那个页面上。在调试中,我收到了我的 vars,但视图没有呈现。 @CadmusX,很高兴你解决了这个问题。如有其他问题,请将它们作为单独的问题发布。 @ramiramilu 我可以在一个控制器上使用它,但是否可以将它传递给多个控制器?【参考方案3】:

尝试更改传递给控制器​​的对象的名称:

$.ajax(
    url: '/dashboard/createcover',
    type: 'POST',
    data: coordinates : JSON.stringify(myData), //change here
    contentType: 'application/json; charset=utf-8',
    success: function (data) 
        alert(data.success);
    ,
    error: function () 
        alert("error");
    ,
    async: false
);

请注意,这会将值作为 JSON 对象发布。你需要像这样修改你的控制器:

public ActionResult CreateCover(string jsonCoordinates) 
    ImageCoordinates coordinates = JsonConvert.DeserializeObject<ImageCoordinates >(jsonCoordinates);

    ViewData.Model = coordinates;
    return View();

您还需要添加对Newtonsoft.Json 的引用。

【讨论】:

Nah.. MVC 内置 json 模型绑定器,无需反序列化 @AlexanderTaran,我部分同意。如果您对传递的字典稍加尝试,您很快就会得出结论,一些解析必须在控制器中显式完成。 @AndreiV 首先感谢您的帮助和时间。我尝试使用您的代码,但收到 500 服务器错误。 POST http://localhost:42771/dashboard/createcover 500 (Internal Server Error) jquery-1.7.1.min.js:4 send jquery-1.7.1.min.js:4 f.extend.ajax jquery-1.7.1.min.js:4 submitForm Imgedit:21 onclick 我应该如何执行 $.ajax 函数?我将它粘贴在单击按钮时调用的 submitForm() funk 中。 @AndreiV 好的。不过,非常感谢您的帮助。

以上是关于如何将js变量发送到mvc控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ajax 以数组格式将多个图像从 MVC 视图发送到控制器?

如何使用 JSONP 将复杂数组发送到 asp.net mvc 控制器

如何将数据从引导菜单项发送到 ASP.NET MVC 控制器

如何使用@Ko.Html.Button 将模型属性值发送到 K-MVC 中的控制器方法

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?

如何在 ASP.NET MVC 中使用 jQuery ajax 方法将数据列表发送到控制器操作方法?