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

Posted

技术标签:

【中文标题】AjaxOption 中的字符串参数在提交时为空,但在响应中显示【英文标题】:String Parameter in AjaxOption null on Submit but showing in Response 【发布时间】:2012-03-18 13:00:48 【问题描述】:

在这段代码中

@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')"

我的 View 模型很简单,看起来像这样

public class MyViewModel

    public int IntegerParameter  get; set; 
    public string StringParameter  get; set; 

我该如何解决这个问题?

添加信息

我尝试将第二个参数更改为 int,现在它不是作为 null 传递而是 0 并且它仍然显示在 FireBug 的响应中。

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

这是我在控制台响应中得到的真实屏幕截图:

---------------另一个更新------

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

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

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

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

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

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

这不起作用。

那么您是否想看看在我考虑了@Darin 和@Shark 的建议的现实世界中真正发生了什么。这是截图:

正如您在响应中看到的那样,它存在,但是当传递给 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);
    );
,

【问题讨论】:

【参考方案1】:

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

型号:

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 成功回调并传递正确的值。

【讨论】:

感谢您的回复,但仍然出现错误,请查看我的问题更新信息 @Raymund,我已经尝试过,但无法重现您的问题。它一直对我有用。 这很奇怪,一直在我身上发生,你使用的是什么 MVC 版本?无论如何,感谢您的帮助和 +1 帮助我的努力。如果我发现有什么问题,我仍然会尝试找到问题并保持更新这篇文章 @Raymund,我正在使用 ASP.NET MVC 3。如果您能够将问题缩小到一个简单的控制器并查看,您可以将您的项目邮寄给我,我很乐意看看为了告诉你出了什么问题。不幸的是,在这个阶段,由于我无法重现该问题,我不知道如何提供进一步的帮助。 你说得对,这必须与 s#arp 架构有关跨度> 【参考方案2】:

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

Html.Raw(Model.StringParameter)

编辑:试试这个:

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

【讨论】:

您好,感谢您的快速回复,但仍然无法正常工作,我在添加 Html.Raw 后添加了屏幕截图 @Raymund &amp;#39 是撇号的 HTML 字符代码。它在某处被编码。 我在myJSFunction中手动添加(" + Model.IntegerParameter + ", '" + Model.StringParameter + "') @Raymund 是的,但是您围绕该参数的撇号不会保持原始状态,当输出到表单元素时,它会被编码为 &amp;#39 @Raymund 查看我的编辑。试试看。这将对您的整个 JavaScript 函数调用进行编码。这应该包括不被编码的撇号。【参考方案3】:

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

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

【讨论】:

刚刚在 S#arp Architecture 项目中尝试过,但无法重现该问题。当你得到一个空值时,发布的数据是什么样的?【参考方案4】:

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

【讨论】:

以上是关于AjaxOption 中的字符串参数在提交时为空,但在响应中显示的主要内容,如果未能解决你的问题,请参考以下文章

首次提交表单时为空值

数据库驱动的选择框在提交时为空

React native - 如果表单提交时为空,则突出显示 TextInput

参数标志,不使用时为空,不使用时为默认值

无法检索记录使用jpa库外键时为空

Flash Flex 变量在字符串中添加时为空