【问题标题】:Passing multiple parameters in Ajax Call with Razor使用 Razor 在 Ajax 调用中传递多个参数
【发布时间】:2016-05-05 22:09:22
【问题描述】:

所以本质上,我正在构建一个 Web API,并且我正在尝试使用 ajax 来查询一个接受两个参数的 Web 服务。我需要传递一个 Sting 列表 (SSN),并且我需要传递一个字符串来确定它查询的环境。 (“a”表示接受,“i”表示集成)。

我正在使用带有剃须刀的 cshtml。到目前为止,这部分已经成功地为我提供了我想要的 div。

var pInputSssns  = document.GetElementById(“SSNinput”).value;
var pTestRegion = document.GetElementById(“testRegion’).value;

但是,就在它下面。我正在尝试将这两个参数都插入到 ajax 调用中。

 $.ajax({
        type: 'GET',
        contentType: "application/json; charset=utf-8" 
        url: "myurl",
        data:"{}",
        success: function (data) {
            // populate a table
        }
    });

我听到了很多关于如何做到这一点的意见。我可以将它们都序列化为 JSON,然后将两个 JSON 对象放入 data 参数中吗?我还听说我可以传递一个 c-sharp 对象,但是如果我尝试这样做,当我在 Razor 代码中时,我将无法访问 html 变量。

 @{ AjaxParam ap = new AjaxParam(); ap.pInputSsns = pInputSsns;}

有没有什么好办法让他们两个都进去?作为参考,这里是控制器:

[ScriptMethod (ResponseFormat = Response Format.Json)] 
[System.Web.Http.HttpGet]
public JArray GetSSNAssociations([FromUri] List <string> pInputSsns, string pTestRegion)
{
\\ do something
}

感谢大家。

【问题讨论】:

    标签: c# jquery ajax razor


    【解决方案1】:

    首先,为要发送的数据创建一个 DTO 类。

    public class SearchRequest
    {
        public List<string> SsnList { set; get; }
        public string Environment { set; get; } 
    }
    

    现在在您的 WebApi 控制器的 Post 方法中将这个类作为参数,这样当客户端发送请求时,默认模型绑定器将能够将请求值映射到该类对象的属性。

    public class ProductsController : ApiController
    {
        public HttpResponseMessage Post([FromBody]SearchRequest req)
        {
           // I am simply returning the same object back. But you can do whatever you want
           // Check req.SsnList and req.Environment properties and do something useful.
            return Request.CreateResponse(HttpStatusCode.OK, req);
        }
    }
    

    现在从客户端代码,您可以构建一个类似于我们的 DTO 类结构的 javascript 对象并使用 jQuery ajax 发送它。

    var model = { Environment: "I",  SssList: ["375329567", "3583345"] };
    var url="../api/products";
    $.ajax({
        type: "POST",
        data: JSON.stringify(model),
        url: url,
        contentType: "application/json"
    }).done(function (res) {
        console.log('res', res);
        // Do something with the result :)
    });
    

    Here 是一篇文章,详细解释了将客户端数据发送到 Web api 的不同选项。

    我硬编码了 url 变量的值。您应该考虑使用像 Url.Action 这样的 Html 辅助方法来生成到您的应用端点的正确相对路径,如 this post 中所述。

    【讨论】:

    • 好的,这似乎是合理的谢谢!我还得看看你提供的链接。我的路线是“GET”而不是“POST”,但我认为这不重要......?我唯一的问题是,第三个代码块中的“var model”发生了什么。我没有硬编码这些值。对那里发生的事情有点困惑。
    • 我只是硬编码了这些值。您可以从 Dom 元素中读取它并构建相同的结构。此外,您应该考虑使用 post 作为 get 可能不适用于复杂数据。
    • 所以我认为这实际上解决了我的问题。它仍然无法正常工作,因为我遇到了 CORS 问题,XMLHttpRequest 无法加载 localhost:64819/api/Participant/getssnassociations?{%22pInputSsns%22:[%xxxx-xx-xxxx--xxxx%22],%22pTestregion%22:%22a%22 }。预检响应具有无效的 HTTP 状态代码 405 所以我将不得不处理它。不过谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多