AjaxOption中的字符串参数在提交时为null但在响应中显示

时间:2012-02-29 01:33:21

标签: c# jquery asp.net-mvc asp.net-mvc-3 s#arp-architecture

在这段代码中

@using (Ajax.BeginForm("MyAction", "MyRouteValues", new AjaxOptions { OnSuccess = "myJSFunction(" + Model.IntegerParameter + ", '" + Model.StringParameter + "')" }))

为什么我的Javascript正确识别Model.IntegerParameter但Model.StringParameter识别为null?我确定它在检查响应时有数据,它显示如下

data-ajax-success="myJSFunction(111111, 'AAAAAA')"

My View模型非常简单,看起来像这样

public class MyViewModel
{
    public int IntegerParameter { get; set; }
    public string StringParameter { get; set; }
}

我该如何解决这个问题?

已添加信息

我尝试将第二个参数更改为int,现在它不会传递为null0仍然显示在FireBug的响应中。

我添加了Html.Raw,但它仍然在Javascript中获得null值。

以下是我在控制台响应中获得的真实截图:

enter image description here

---------------另一次更新------------------

我尝试了所有的建议,但它似乎是 BUG MVC s#arp ?我试过不同的项目和不同的PC,它仍然适合我。我注意到这只会发生,如果它来自一个模型它看起来像在Javascript的响应之间发生的事情,无论是参数中的第一个,第二个还是任何位置但是如果我使用硬编码值,字符串的值都会丢失如:

myJSFunction(" + Model.IntegerParameter + ", 'AAAAAAAA')"

我得到了一个成功的结果,如果我使用这样的jQuery:

myJSFunction(" + Model.IntegerParameter + ", $('#SearchString').val())"

这也有效但是如果我确实传递了一个像这样的字符串的模型

myJSFunction(" + Model.IntegerParameter + ", '" + Model.StringParameter + "')"

这不起作用。

所以你想看看现实世界中真正发生了什么,我考虑了@Darin和@Shark的建议。这是一个截图:

enter image description here

正如您在响应中看到的那样,它存在但是当传递给Javascript时,它会丢失。这是真实的Javascript以及

displayResultsPopUpWindow: function (model) {
    var postData = {
        transactionId: model.transactionId,
        searchString: model.searchString
    };

    $.post("/Invoicing/GetSearchResults", postData, function (data) {
        WindowHelper.displayWindow("Add Airline Transaction", "<div id='matchBookingResults'>" + unescape(data.viewHtml) + "</div>", 640, 500);
    });
},

4 个答案:

答案 0 :(得分:4)

无法重现此问题。试试这样:

型号:

public class MyViewModel
{
    public int IntegerParameter { get; set; }
    public string StringParameter { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel
        {
            IntegerParameter = 1111,
            StringParameter = "AA'AA\"AA"
        });
    }

    [HttpPost]
    public ActionResult MyAction()
    {
        return Json(new { foo = "bar" });
    }
}

查看:

@model MyViewModel

<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
<script type="text/javascript">
    var myJSFunction = function (model) {
        alert('intParam=' + model.intParam + ', strParam=' + model.strParam);
    };
</script>

@using (Ajax.BeginForm(
    "MyAction",
    "Home",
    new AjaxOptions
    {
        OnSuccess = "myJSFunction(" + Json.Encode(new { intParam = Model.IntegerParameter, strParam = Model.StringParameter }) + ")"
    }
))
{
    <button type="submit">OK</button>
}

使用AJAX提交表单时,会调用myJSFunction成功回调并传递正确的值。

答案 1 :(得分:1)

看起来这是一个Html编码的字符串。试着这样做:

Html.Raw(Model.StringParameter)

修改:试试这个:

OnSuccess = Html.Raw("myJSFunction(" + Model.IntegerParameter + ", '" + Model.StringParameter + "')")

答案 2 :(得分:0)

看起来像S#arp架构中的一个错误,所以我只是使用jQuery来提取我需要的值,而不是使用模型

myJSFunction(" + Model.IntegerParameter + ", $('#SearchString').val())"

答案 3 :(得分:0)

您的searchString为null,可能是因为输入名称为SearchString - 字母大小写有意思。