将Javascript结果改为View

时间:2017-03-15 10:17:02

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

我有一个问题,我在使用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传递给我的Controller。 我的控制器只是期待具有属性Suchfeld和Suchschluesseltyp的对象的IEnumarable。

有人有想法吗?

谢谢大家。

3 个答案:

答案 0 :(得分:2)

首先,您需要更改调用控制器操作的方式。您应该使用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<T>方法将其转换并返回。

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

[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);

答案 1 :(得分:0)

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

$.getScript("Home","Display")

// Home Controller
private JavaScriptResult Display()
{
    string message = "alert('Hello World');";

    return new JavaScriptResult { Script = message };
}

答案 2 :(得分:0)

如果使用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();
    }
});