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&#39
是撇号的 HTML 字符代码。它在某处被编码。
我在myJSFunction中手动添加(" + Model.IntegerParameter + ", '" + Model.StringParameter + "')
@Raymund 是的,但是您围绕该参数的撇号不会保持原始状态,当输出到表单元素时,它会被编码为 &#39
。
@Raymund 查看我的编辑。试试看。这将对您的整个 JavaScript 函数调用进行编码。这应该包括不被编码的撇号。【参考方案3】:
看起来像 S#arp 架构中的一个错误,所以我没有使用模型,而是使用 jQuery 来提取我需要的值
myJSFunction(" + Model.IntegerParameter + ", $('#SearchString').val())"
【讨论】:
刚刚在 S#arp Architecture 项目中尝试过,但无法重现该问题。当你得到一个空值时,发布的数据是什么样的?【参考方案4】:您的 searchString 为 null 可能是因为输入名称为 SearchString - 字母大小写有含义。
【讨论】:
以上是关于AjaxOption 中的字符串参数在提交时为空,但在响应中显示的主要内容,如果未能解决你的问题,请参考以下文章