【问题标题】:Pasing Javascript result to View将 Javascript 结果传递给 View
【发布时间】:2017-03-15 10:17:02
【问题描述】:

我有一个问题,我对使用 Asp.net 非常陌生。 我有一个 Javascript,我想将数据传递给我的控制器。

<script type="text/javascript">
        $("#SearchButton").on("click", function () {
            var $sucheMoped = [];
            $("#tab_logic tbody tr")
                .each(function () {
                    var $Item = $(this);
                    var suchfeld = $Item.find("td > input[name='Suchfeld']").val();
                    var schluessel = $Item.find("td > select[name='Suchschluessel'] > option:selected").val();
                    alert(suchfeld + "&&&" + schluessel);
                    $sucheMoped.push({
                        Suchfeld: suchfeld,
                        Suchschluesseltyp: schluessel
                    });
                });
            window.open('@Url.Action("MainView","MainView")?SuchObject='+$sucheMoped);
        })
    </script>

我只想将“sucheMoped”从我的 javaScript 传递给我的控制器。 我的控制器只是期待一个 IEnumarable 具有属性 Suchfeld 和 Suchschluesseltyp 的对象。

有人有想法吗?

谢谢各位。

【问题讨论】:

    标签: javascript c# asp.net asp.net-mvc razor


    【解决方案1】:

    首先,您需要更改调用控制器操作的方式。您应该使用JSON.stringify() 方法对数组进行字符串化。

    所以,这应该是这样的:

    window.open('@Url.Action("MainView","MainView")?SuchObject='+JSON.stringify($sucheMoped));

    然后,您需要创建一个自定义模型绑定器以将您的数组与 action 参数绑定。这是一个简单的数组模型绑定器,仅用于演示目的,它不考虑故障或其他什么,但它在这种情况下工作,传递正确的数据,所以请修改它以满足您的需要。

    public class ArrayModelBinder: DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var rawArray = controllerContext.HttpContext.Request.QueryString["SuchObject"];
            var array = JsonConvert.DeserializeObject<IEnumerable<MyObject>>(rawArray);
    
            return array;
        }
    }
    

    我这里做的是获取通过URL提交的查询字符串,用JsonConvert.Deserialize&lt;T&gt;方法转换并返回。

    您只需使用自定义模型绑定器在控制器的操作中装饰您的参数,如下所示:

    [HttpGet]
    public ActionResult Search([ModelBinder(typeof(ArrayModelBinder))]IEnumerable<MyObject> SuchObject)
    {
        return View(SuchObject);
    }
    

    编辑

    window.open 在您想打开一个新的浏览器窗口时很有用。您也可以使用它来打开一个新标签页。

    要在不打开新选项卡或窗口的情况下导航到另一个位置,请使用 window.location 属性,如下所示:

    window.location = '@Url.Action("Search", "Home")?SuchObject=' + JSON.stringify(array);

    【讨论】:

    • 谢谢,这很好用。我的最后一个问题是这个 window.open 方法总是打开一个新选项卡,但我只想覆盖我的 excisting...
    • 然后使用window.location。相应地更新。如果它解决了您的问题,请点赞并标记为答案。谢谢
    【解决方案2】:

    如果使用 jQuery.ajax 方法,可以将复杂对象作为data 参数传递。

    $.ajax({
        url: '@Url.Action("MainView", "MainView")',
        type: 'GET',
        data: { 'SuchObject': $sucheMoped },
        success: function (htmlContent) {
            // write content to new window (from http://stackoverflow.com/a/23379892/1450855)
            var w = window.open('about:blank', 'windowname');
            w.document.write(htmlContent);
            w.document.close();
        }
    });
    

    【讨论】:

    【解决方案3】:

    您可以使用 jquery 库 $.getScript 来调用控制器中的操作方法并在您的操作中返回 javascriptResult 类型。

    $.getScript("Home","Display")
    
    // Home Controller
    private JavaScriptResult Display()
    {
        string message = "alert('Hello World');";
    
        return new JavaScriptResult { Script = message };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多