【问题标题】:Sending array of inputs in form with jquery使用 jquery 以表单形式发送输入数组
【发布时间】:2019-05-23 14:45:01
【问题描述】:

我有一家产品商店。 每个产品都有一个 ID、一个价格和一个名称。 当一个人点击“购买”按钮时,会打开一个表单,以便他们填写地址、电子邮件和姓名。 当用户点击提交时,我会向发送信息的控制器进行 AJAX 调用。

我尝试了几种解决方案,但找不到一个可行的解决方案:/ 我要做的是发送电子邮件、地址、姓名和一系列产品。

carrinho.js (shoppingcart.js):

function go(nr) {
$('.confirm').toggleClass('comein');
$('#shoppingCart').toggle("fade");

var i = 0;

$("div #cartItems > .itemrow").each(function () {

    var nome = $(this).find("h3").text();
    var preco = $(this).find(".price").text();
    var id = $(this).find(".id").text();

    $("#form").append("" +
        "<input type='hidden' name='[" + i + "].produtos' value='" + nome + "' id='nomeenc' readonly /> " +
        "<input type='hidden' name='[" + i + "].produtos' value='" + id + "' id='idenc' readonly />" +
        "<input type='hidden' name='[" + i + "].produtos' value='" + preco + "' id='precoenc' readonly />");

    $(".messageSuccess button .removeItem").remove();
    $(".messageSuccess img").remove();
    i = i + 1;
});

$("form").on("submit", function (e) {
    e.preventDefault();

    var form = $(this);

    $.ajax({
        type: 'POST',
        url: '/Compra/Encomenda',
        data: form.serialize(),
        success: function () {
            $('.confirm').toggleClass('comein');
            $('#emptyCart').fadeToggle(nr);
            $('.messageSuccess').toggleClass('comein');
        }
    });
});
}

控制器:

public ActionResult Encomenda(SubmitFormModel produtos)
    {
        var model = produtos;

        string path = Server.MapPath("~/files");
        DateTime time = DateTime.Now;
        string date = time.ToString("yyyy-MM-dd-hh-mm-ss");

        XmlSerializer serializer = new XmlSerializer(typeof(SubmitFormModel));
        StreamWriter writer = new StreamWriter(path + "\\" + date + ".xml");
        serializer.Serialize(writer, model);
        writer.Close();

        return PartialView(model);
    }

SubmitFormModel.cs:

namespace Loja.Models
{
[Serializable]
public class SubmitFormModel
{
public List<Produto> Produtos { get; set; } //produto = product
    public string Morada { get; set; } //address
    public string Email { get; set; }
    public string Nome { get; set; } //name
}

}

Produto.cs:

namespace Loja.Models
{
[Serializable]
public class Produto
{
    public int Id { get; set; }
    public string Nome_produto { get; set; } //product_name
    public string Tipo { get; set; } //type
    public string Detalhes { get; set; } //details
    public string Imagem { get; set; } //image
    public int Preco { get; set; } //price
    public string ImgArt { get; set; }
}
}

表格:

<form action="/Compra/Encomenda" method="post" id="form">
    <label class="field a-field a-field_a3 page__field">
        <input class="field__input a-field__input" placeholder="ex. Rodrigo Barradinhas" required name="nome" type="text" id="nome_cliente">
        <span class="a-field__label-wrap">
            <span class="a-field__label">Nome completo</span>
        </span>
    </label>

    <label class="field a-field a-field_a3 page__field">
        <input class="field__input a-field__input" placeholder="ex. email@domain.com" required name="email" type="text" id="email">
        <span class="a-field__label-wrap">
            <span class="a-field__label">E-mail</span>
        </span>
    </label>

    <label class="field a-field a-field_a3 page__field">
        <input class="field__input a-field__input" placeholder="ex. Rua x Nºy 1167-004 Lisboa" required name="morada" type="text" id="morada">
        <span class="a-field__label-wrap">
            <span class="a-field__label">Morada</span>
        </span>
    </label>

    <input type='submit' name='confirmar' value='confirmar' class='event' data-main='Compra' />
    <br /><br />
</form>

我想进入我的控制器,例如: https://imgur.com/a/3woa1sy

还有一系列产品

【问题讨论】:

  • 不应该是name='produtos[" + i + "].name'而不是name='[" + i + "].produtos'吗?像您一样,每个属性只有一个输入,但 name 等于 produtos[" + i + "].**propertyName**
  • 同样在each 方法中,您将相同的id 设置为多个input,这不是一个好主意,因为ids 应该是唯一的。如果您不需要它们,我建议您删除它们。
  • @colinD 关于 id,我已经删除了它们,那是从以前开始的,当我没有 foreach() 并且它是单个产品时
  • @colinD 我尝试了你的建议,这就是我得到的:imgur.com/a/WRwmgwP
  • 它应该是produtos[" + i + "].nome_produto 而不是nome 以匹配Produto 模型,但奇怪的是,其他属性不再设置了。

标签: c# jquery forms


【解决方案1】:

另一种方法。我总是发现处理 JSON 比处理多个输入属性更简单。

  1. 首先,我建议不要从 HTML 的 text 中获取值,而应附加 **data-*** 属性。假设您的 HTML 类似于
<div id="cartItems">
    <div class="itemrow">
        ...
        <h3>Samsung Mobile S10</h3>
        <span class="price">350</span>
        <input type="hidden" class="id" value="34">
        ...
    </div>
    <div class="itemrow">
        ...
        <h3>IPhone 7s</h3>
        <span class="price">650</span>
        <input type="hidden" class="id" value="38">
        ...
    </div>
</div>

您应该创建一个类似于此的 HTML,而不是这个

<div id="cartItems">
    <div class="itemrow" data-pid="34" data-price="350" data-name="Samsung Mobile S10">
        ...
        <h3>Samsung Mobile S10</h3>
        <span class="price">350</span>
        <input type="hidden" class="id" value="34">
        ...
    </div>
    <div class="itemrow" data-pid="38" data-price="650" data-name="IPhone 7s">
        ...
        <h3>IPhone 7s</h3>
        <span class="price">650</span>
        <input type="hidden" class="id" value="38">
        ...
    </div>
</div>
  1. 您应该创建一个包含购物车中所有产品的 JSON 数组字符串。创建一个隐藏控件并将您的产品 JSON 放在那里。
<input type="hidden" id="allproductsjson" value="">

您的功能可能类似于

$("form").on("submit", function (e) {
    e.preventDefault();
    createProductsJSON();
    var form = $(this);
    $.ajax({
        type: 'POST',
        url: '/Compra/Encomenda',
        data: form.serialize(),
        success: function () {
            $('.confirm').toggleClass('comein');
            $('#emptyCart').fadeToggle(nr);
            $('.messageSuccess').toggleClass('comein');
        }
    });
});

function createProductsJSON() {
    var jsonObj = [];
    $("#cartItems > .itemrow").each(function() {
        var pId = $(this).attr("data-pid");
        var pName = $(this).attr("data-name);
        var pPrice = $(this).attr("data-price);

        var item = {}
        item ["id"] = pId;
        item ["name"] = pName;
        item ["price"] = pPrice;

        jsonObj.push(item);
    });

    console.log(jsonObj);
    $("#allproductsjson").val(JSON.stringify(jsonObj));
}
  1. 在控制器中,您将只获得一个字段,您只需执行 parsejson 即可获得输出。

让我知道这是否适合你。

【讨论】:

  • 您好@Jay Pagnis,感谢您的评论,非常感谢。我将在未来的项目中尝试这个,但再次感谢您!我刚读完 12 年级,正在一家公司实习,我还在学习 :) 希望有一天能成为一名优秀的程序员
【解决方案2】:

var 名称有问题:/

看起来是绑定过程中出现的变量名问题。您能否更改方法 public ActionResult Encomenda(SubmitFormModel produtos) 中的变量名称并查看它是否有效?例如 Encomenda(SubmitFormModel formModel)。 – 柯林德

成功了。谢谢

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 2018-05-27
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多