【问题标题】:ASP.NET and jQuery - Bulk Data UpdateASP.NET 和 jQuery - 批量数据更新
【发布时间】:2017-09-06 00:09:07
【问题描述】:

我正在使用 ASP.NET 和 jQuery,我正在尝试做的是批量数据更新关注焦点(当有人从一个输入字段切换到另一个输入字段时,更新用户刚刚从输入字段中跳出的数据)

这是我的多行之一的 HTML:

<tr>
   <td><input type='text' name='ID' value='345924' /></td>
   <td><input type='text' name='carNo' value='1' /></td>
   <td><input type='text' name='BuyerName' value='Steve' /></td>
   <td><input type='text' name='BuyDate' value='3/15/2016' /></td>
   <td><input type='text' name='Description' value='Steve payment went through' /></td>
   <td><input type='text' name='amount' value='' /></td>
   <td><input type='text' name='payedSoFar' value='73501.71' /></td>
   <td><input type='text' name='lastPaid' value='2/19/2016' /></td>
   <td><input type='text' name='notified' value='s' /></td>
   <td><input type='text' name='notifiedDate' value='2/22/2016' /></td>
   <td><input type='text' name='issues' value='' /></td>
   <td><input type='text' name='issueDate' value='' /></td>
   <td><input type='text' name='Notes' value='' /></td>
</tr>

这是我的 jQuery 代码,重点在于调用 API 进行更新:

$("input[type=text]").on("focusout", function () {

        $.ajax({
            url: "/api/Action/updateCarInfo",
            type: "GET",
            error: function (request, status, error) {
            },
            success: function (data) {
            }
        });

    });

这是我正在调用的 ASP.NET API 控制器:

[ResponseType(typeof(void))]
        public IHttpActionResult updateCarInfo(int id, carClass cars)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != cars.ID)
            {
                return BadRequest();
            }

            db.Entry(cars).State = EntityState.Modified;

            db.SaveChanges();

            return StatusCode(HttpStatusCode.NoContent);
        }

所以我的问题是,我如何传递我刚刚从标签中取出的列的数据并传递第一列的 id?还是我必须传递整行数据,即使它没有改变?

【问题讨论】:

    标签: jquery asp.net asp.net-mvc asp.net-apicontroller


    【解决方案1】:

    为什么不使用 changed 事件。您只需要在实际更改数据时触发此获取。我还建议为行或输入分配一个类。

    <table>
        <tr class='my-custom-class'>
           <td><input type="text" name="ID" value="345924" /></td>
           ...
        </tr>
    </table>
    

    这将允许您在行级别处理您的事件。

    $('.my-custom-class input').change(function () {
        $.ajax({
            url: "/api/Action/updateCarInfo",
            type: "GET",
            data: $(this).parent().parent ().find('input').serialize(),
            error: function (request, status, error) {
    
            },
            success: function (data) {
    
            }
        });
    });
    

    我使用 serialize 方法是因为我们可以将整行序列化为您的 get 请求的查询字符串。

    ID=345924&carNo=1&...
    

    如果您需要重新组织查询字符串中的数据,您可以轻松地单独获取 ID。我只使用了序列化,因为这样会更容易,但如果控制器方法路由不正确,请告诉我。

    var id = $(this).parent().parent().find('data-id').attr('data-id');
    
    //OR
    
    var id = $(this).parent().parent().find('[name="carNo"]').data('id');
    

    如果此解决方案有问题,请告诉我。很乐意容纳。

    【讨论】:

    • 这一行没有抓取整行
    • 这不会抓取整行data: $(this).parent().find('input').serialize(),
    • 谢谢。固定。
    • 好的,我可以抓取整行,但是当我尝试将它传递给我的 ASP.NET API 控制器时,我得到 null :(
    • 你的路由是什么样的?另外,您打算在哪里绑定 Id 参数?来自 uri?
    【解决方案2】:

    $(this).val() 将为您提供触发该函数的字段的值,从而涵盖获取相应字段的值。

    至于传递 ID,有多种方法可以实现。一种方法是使用类似的东西:

    $(this).closest("tr").find("input[name=ID]").val();

    这将遍历 DOM 到父 tr 元素,找到其中的 ID 字段,并提供其值。

    提交整行的替代方案:

    <form action="/api/Action/updateCarInfo">
        <table>
            <tr>
               <td><input type="text" name="ID" value="345924" /></td>
               <td><input type="text" data-id="345924" name="carNo" value="1" /></td>
               <td><input type="text" name="BuyerName" value="Steve" /></td>
               <td><input type="text" name="BuyDate" value="3/15/2016" /></td>
               <td><input type="text" name="Description" value="Steve payment went through" /></td>
               <td><input type="text" name="amount" value="" /></td>
               <td><input type="text" name="payedSoFar" value="73501.71" /></td>
               <td><input type="text" name="lastPaid" value="2/19/2016" /></td>
               <td><input type="text" name="notified" value="s" /></td>
               <td><input type="text" name="notifiedDate" value="2/22/2016" /></td>
               <td><input type="text" name="issues" value="" /></td>
               <td><input type="text" name="issueDate" value="" /></td>
               <td><input type="text" name="Notes" value="" /></td>
            </tr>
        </table>
    </form>
    

    您可以使用$(this).closest("form").submit() 找到该行的父表单并提交。

    【讨论】:

    • 您会推荐这种方法还是建议通过整行?
    • 对于您提交的数据量,一次通过整行是相当标准的公平,但在这种情况下,我建议不要使用focusout 方法,以便避免为每个字段的焦点发布整行 - 而不是在用户完成编辑整行时选择发布单个帖子。
    • 我希望我能做到这一点,但是当他们点击时要求这样做,他们之前使用的是 Access,同样的交易,输入字段行,当他们点击选项卡时,它会更新数据。跨度>
    • 访问 畏惧 bleh。这很公平——有时你必须做你必须做的事情。
    • 所以如果我要保存整行,我会怎么做?我猜它作为一个类传递
    猜你喜欢
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多