首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在显示局部视图时,主视图上的按钮不起作用?

为什么在显示局部视图时,主视图上的按钮不起作用?
EN

Stack Overflow用户
提问于 2020-07-16 04:41:28
回答 1查看 42关注 0票数 0

我刚刚使用ASP.NET Core MVC为CRUD创建了一个简单的项目。编辑是使用局部视图。编辑本身是有效的,但只要局部视图显示,主视图上的按钮就不起作用,甚至不能进入相应的功能。我在哪里做错了什么?我该如何解决这个问题?附件是我认为相关的所有代码片段。

Cost.cs

代码语言:javascript
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace CarpetWash.Models
{
    public class Cost
    {
        [Key]
        public int Id { get; set; }

        public DateTime? Date { get; set; }
        public decimal? Expense { get; set; }
        public string? Item { get; set; }
        public string? Description { get; set; }
        public string? Location { get; set; }
        public string? Note { get; set; }
    }
}

CarpetWashContext.cs

代码语言:javascript
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;

namespace CarpetWash.Models
{
    public class CarpetWashContext : DbContext
    {
        public DbSet<Cost> Costs { get; set; }

        public CarpetWashContext(DbContextOptions<CarpetWashContext> options) : base(options)
        {
        }
        public CarpetWashContext()
        {
        }
    }
}

CarpetWashViewModel.cs

代码语言:javascript
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CarpetWash.Models
{
    public class CarpetWashViewModel
    {
        public List<Cost> Costs { get; set; }
        public Cost SelectedCost { get; set; }
        public string DisplayMode { get; set; }
    }
}

Cost.cshtml

代码语言:javascript
运行
AI代码解释
复制
@model CarpetWash.Models.CarpetWashViewModel

@{
    ViewData["Title"] = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

    <head>
        <script src="~/lib/jquery/dist/jquery.min.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
        <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.css" />
        <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.js"></script>
        <script>
            $(document).ready(function () {
                $("#tblCosts").DataTable({
                    "aLengthMenu": [[5, 10, 25, -1], [5, 10, 25, "All"]],
                    "iDisplayLength": 10,
                });
            });
        </script>
    </head>
<h1>Costs</h1>
<body>
    <form method="post">
        @{
            if (Model.SelectedCost != null)
            {
                if (Model.DisplayMode == "ReadWrite")
                {
                    Html.RenderPartial("EditCost", Model.SelectedCost);
                }

            }
            if (Model.DisplayMode == "WriteOnly")
            {
                Html.RenderPartial("InsertCost", new Earn());
            }

        }

        <div>
            <input type="submit" value="Add New Cost" formaction= "/CarpetWash/newCost" class="btn btn-primary" tabindex="1" />
        </div>

        <div>
            <table id="tblCosts" class="table">
                <thead>
                    <tr>
                        <th>Id</th>
                        <th>Date</th>
                        <th>Expense</th>
                        <th>Item</th>
                        <th>Description</th>
                        <th>Location</th>
                        <th>Note</th>
                        <th>Edit</th>
                        <th>Delete</th>
                    </tr>
                </thead>
                <tbody>
                    @if (Model.Costs != null)
                    { 
                        foreach (var item in Model.Costs)
                        {
                            if (Model.SelectedEarn != null)
                            {
                                if (item.Id == Model.SelectedCost.Id)
                                {
                                    @:<tr class=" SelectedItem">
                                }
                                else
                                {
                                    @:<tr>
                                }
                            }
                                <td>
                                    @Html.DisplayFor(modelItem => item.Id)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Date)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Expense)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Item)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Description)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Location)
                                </td>
                                <td>
                                    @Html.DisplayFor(modelItem => item.Note)
                                </td>
                                <td><input type="submit" value="Edit" class="btn btn-primary Edit" formaction="/CarpetWash/selectCost/@item.Id " /></td>
                                <td>
                                    <input type="submit" value="Delete" class="btn btn-primary Delete" formaction="/CarpetWash/deleteCost/@item.Id" />
                                </td>
                            @:</tr>
                        }
                    }
                </tbody>
            </table>
        </div>

    </form>

</body>

部分视图EditCost.cshtml

代码语言:javascript
运行
AI代码解释
复制
@model CarpetWash.Models.Cost

<h4>Cost</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="SelectCost">
            <div class="form-group">
                <label asp-for="Id" class="control-label"></label>
                @Html.TextBoxFor(m => m.Id, new { @readonly = "readonly" })
                <span asp-validation-for="Id" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Date" class="control-label"></label>
                @Html.TextBoxFor(m => m.Date, new { @title = "Please input a date (i.e. 2020-07-01)" })
                <span asp-validation-for="Date" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Expense" class="control-label"></label>
                @Html.TextBoxFor(m => m.Expense, new { @title = "Please input a string" })
                <span asp-validation-for="Expense" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Item" class="control-label"></label>
                @Html.TextBoxFor(m => m.Item, new { @title = "Please input a string" })
                <span asp-validation-for="Item" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Description" class="control-label"></label>
                @Html.TextBoxFor(m => m.Description, new { @title = "Please input a string" })
                <span asp-validation-for="Description" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Location" class="control-label"></label>
                @Html.TextBoxFor(m => m.Location, new { @title = "Please input a string" })
                <span asp-validation-for="Location" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Note" class="control-label"></label>
                @Html.TextBoxFor(m => m.Note, new { @title = "Please input a string" })
                <span asp-validation-for="Note" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Save" class="btn" formaction="/CarpetWash/updateCost/@Model.Id" />
                <input type="submit" value="Cancel" class="btn" formaction="/CarpetWash/cost" />
            </div>
        </form>
    </div>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

CarpetWashController.cs

代码语言:javascript
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using JiaCarpetWash.Common;
using JiaCarpetWash.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;

namespace CarpetWash.Controllers
{
    public class CarpetWashController : Controller
    {
        private readonly CarpetWashContext _context;
        private readonly IOptions<AppSettings> _mySettings;
        private readonly string _dbConnectString;
        private readonly IMemoryCache _MemoryCache;


        public CarpetWashController(CarpetWashContext context, IOptions<AppSettings> mySettings, IMemoryCache memCache)
        {
            _context = context;
            _mySettings = mySettings;
            _dbConnectString = _mySettings.Value.DBConnectionString;
            _MemoryCache = memCache;
        }

        // GET: CarpetWashController
        public async Task<IActionResult> Cost()
        {
            CarpetWashViewModel model = new CarpetWashViewModel();
            model.Costs = await _context.Costs.ToListAsync();
            model.SelectedCost = null;
    
            return View(model);
        }


        public async Task<IActionResult> SelectCost(int? id)
        {
            CarpetWashViewModel model = new CarpetWashViewModel();
            model.Costs = await _context.Costs.ToListAsync();

            var cost = await _context.Costs.FindAsync(id);
            if (cost == null)
            {
                return NotFound();
            }
            model.SelectedCost = cost;
            model.DisplayMode = "ReadWrite";

            return View("Cost", model);
        }

        [HttpPost]
        public async Task<IActionResult> SelectCost(int id)
        {
            CarpetWashViewModel model = new CarpetWashViewModel();
            model.Costs = await _context.Costs.ToListAsync();

            var cost = await _context.Costs.FindAsync(id);
            if (cost == null)
            {
                return NotFound();
            }
            model.SelectedCost = cost;
            model.DisplayMode = "ReadWrite";

            return View("Cost", model);
        }

        // GET: CarpetWashController/UpdateCost/5
        public async Task<IActionResult> UpdateCost(int? id)
        {
            CarpetWashViewModel model = new CarpetWashViewModel();

            if (id == null)
            {
                return NotFound();
            }

            var cost = await _context.Costs.FindAsync(id);
            if (cost == null)
            {
                return NotFound();
            }
            model.SelectedCost = cost;
            model.DisplayMode = "ReadWrite";

            return View("Cost", model);
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> UpdateCost(int id, [Bind("Id,Date,Expense,Item,Description,Location,Note")] Cost cost)
        {
            if (id != cost.Id)
            {
                return NotFound();
            }

            CarpetWashViewModel model = new CarpetWashViewModel();
            model.SelectedCost = cost;

            if (ModelState.IsValid)
            {
                model.DisplayMode = "ReadOnly";
                try
                {
                    _context.Update(cost);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!_context.Costs.Any(e => e.Id == id))
                    {
                        return NotFound();
                    }
                    else
                    {
                        throw;
                    }
                }
                model.SelectedCost = null;
            }
            else
            {
                model.DisplayMode = "ReadWrite";
            }
            model.Costs = await _context.Costs.ToListAsync();

            return View("Cost", model);
        }

        // GET: CarpetWashController/DeleteCost/5
        public async Task<IActionResult> DeleteCost(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }
            var cost = await _context.Costs
                .FirstOrDefaultAsync(m => m.Id == id);
            if (cost == null)
            {
                return NotFound();
            }

            return View("Cost");
        }

        // POST: CarpetWashController/DeleteCost/5
        [HttpPost, ActionName("DeleteCost")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DeleteCostConfirmed(int id)
        {
            CarpetWashViewModel model = new CarpetWashViewModel();
            var cost = await _context.Costs.FindAsync(id);
            if (cost != null)
            {
                DeleteCostById(id);
                _context.Costs.Remove(cost);
                await _context.SaveChangesAsync();
            }
            model.Costs = await _context.Costs.ToListAsync();
            model.SelectedCost = null;
            model.DisplayMode = "ReadOnly";
            return View("Cost", model);
        }

        private void DeleteCostById(int id)
        {
            using SqlConnection connection = new SqlConnection(_dbConnectString);
            using SqlCommand command = new SqlCommand("RemoveCost", connection);
            command.CommandType = CommandType.StoredProcedure;
            using var da = new SqlDataAdapter(command);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-16 07:55:50

因为您的分部视图包含一个表单,并且在Cost.cshtml中它也有一个将分部视图放入表单中的form.You,但是您不能嵌套forms.So,所以可以将部分视图移到表单之外。下面是一个演示: CarpetWashController.cs:

代码语言:javascript
运行
AI代码解释
复制
public IActionResult Index()
        {
            return View();
        }
        public IActionResult Cost()
        {
            CarpetWashViewModel c = new CarpetWashViewModel();
            List<Cost> cs = new List<Cost> { new Cost { Id = 1, Item = "item1", Date = new DateTime(), Expense = 1, Description="d1", Note="n1", Location="l1"} };
            Cost c1 = new Cost { Id = 2, Item = "item2", Date = new DateTime(), Expense = 2, Description = "d2", Note = "n2", Location = "l2" };
            cs.Add(c1);
            c.SelectedCost = c1;
            c.Costs = cs;
            c.DisplayMode = "ReadWrite";
            return View(c);
        }
        public IActionResult newCost() {
            return View("Index");
        }
        public IActionResult selectCost(int id)
        {
            return View("Index");
        }
        public IActionResult deleteCost(int id)
        {
            return View("Index");
        }

Cost.cshtml:

代码语言:javascript
运行
AI代码解释
复制
<div>

    <div>
        @if (Model.SelectedCost != null)
        {
            if (Model.DisplayMode == "ReadWrite")
            {
                Html.RenderPartial("EditCost", Model.SelectedCost);
            }

        }
    </div>
    <form method="post">




        <input type="submit" value="Add New Cost" formaction="/CarpetWash/newCost" class="btn btn-primary" tabindex="1" />



        <div>
            <table id="tblCosts" class="table">
                <thead>
                    <tr>
                        <th>Id</th>
                        <th>Date</th>
                        <th>Expense</th>
                        <th>Item</th>
                        <th>Description</th>
                        <th>Location</th>
                        <th>Note</th>
                        <th>Edit</th>
                        <th>Delete</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td><input type="submit" value="Edit" class="btn btn-primary Edit" formaction="/CarpetWash/selectCost/1 " /></td>
                        <td>
                            <input type="submit" value="Delete" class="btn btn-primary Delete" formaction="/CarpetWash/deleteCost/1" />
                        </td>
                    </tr>
                   
                </tbody>
            </table>
        </div>

    </form>


</div>

结果:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62927585

复制
相关文章
ssh保持长连接的方式,ssh保持连接不断开
高久峰
2023/06/20
6980
SSH 保持连接不再 Broken pipe
百度云服务器今年双十一打折,2核4G第一年 358,于是乎我就满心欢喜的准备装个 GitLab 玩玩,吐槽一下,百度云的交互体验上有待优化,用起来比较麻烦(相比阿里云和腾讯云),另外他家的 ssh 服务连接中断次数很频繁的。不过就这价格也不要指望太多,自食其力吧。
上山打老虎了
2022/06/15
6360
Nginx反向代理时保持长连接
HTTP1.1之后,HTTP协议支持持久连接,也就是长连接,优点在于在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
星哥玩云
2022/07/28
3.2K0
关于HTTP协议中的保持连接
缘起 中午在群里讨论,用ab测试 一台只提供静态文件服务, 不与其他任何系统交互的时候,为什么也会产生大量的TIME WAIT状态的。 首先,我们可以简单的理解,在TCP连接的两端,谁主动断开连接(先发送FIN包),谁进入TIME WAIT,谁被动断开连接(后发送FIN包),谁进入CLOSE WAIT状态。 那么,由此可以推断,在这个场景中,server是主动断开连接的一方,那么server为什么会主动断开呢, 这就涉及到HTTP里关于keepalive的内容了。 我们常常听说keepalive能提高web
小小科
2018/05/03
2K0
关于HTTP协议中的保持连接
Http环境下的保持连接方式
Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如Web IM)的场景中,我们却希望能及时得到服务器给我们返回的数据。此时,一种最为普遍的做法是:在客户端用定时器,定时去请求服务器的服务,来得到最新数据。而这样一来,很多时候却是在做无用功,频繁的请求也会无端的增加服务器和客户端在请求Web服务上的消耗。那么是否有一种更好的办法,既可以及时得到服务器的返回,同时又可以减少做无用功,以及频繁请求带来的性能问题呢?
Java架构师必看
2021/03/22
6300
nginx反向代理时保持长连接
深入了解nginx,get到nginx的一些性能优化方向。除了了解如何保持长连接,也通过本案例学习到开源中间件的一些常用定位思路和优化方法。
京东技术
2021/06/09
9.2K0
保持SSH连接持续不断的配置方法
在修改服务器的一些文件的过程中,经常碰到的情况就是需要隔一段时间修改一下文件,然后需要去查阅相关的资料,等下一次想修改的时候发现ssh连接由于长时间未相应已经断开了。而且这时候终端会卡在那里,十分的不方便。所以在网上找了几个配置SSH的方法,能保证连接能够长时间不断开。 方法有两种,一般配置一种就可以。但是我为了效果更好,把他们同时配置一下:
mythsman
2022/11/14
2K0
socket.io
本译文来源于https://socket.io/get-started/chat/,不足之处请多批评指正。 最近在学些vuejs和websocket相关技术,使用了websocket的两个封装的库vue-socket.io和vue-websocket
ccf19881030
2020/04/10
3.9K0
socket.io
解决httpclient因为保持永久长连接造成连接吊死的问题
httpclient使用了连接池,如果没有设置keep-alive策略,PoolingHttpClientConnectionManager会默认使用永久连接。
用户7043603
2022/02/25
3.5K0
Redis连接长时间不操作连接超时
springboot整合redis,长时间不操作连接超时 我原来的依赖是这个 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 后来一直出现连接超时 解决办法,把依赖改一下 <dependency> <g
高大北
2022/06/14
2.7K0
Winscp连接不上Kali
首次输入连接主机的IP地址,端口号默认为22,用户名密码均为自己设定的,或者root也可以
全栈程序员站长
2022/10/05
6.7K0
Winscp连接不上Kali
保持生长不焦虑,非科班程序媛的进击
我们为什么叫「递归」 “递归” (recursion) 是一种在程序设计语言中被广泛使用的算法。它有两大特点,一是调用自己,二是化繁为简。我们当中那些优秀的技术人又何尝不是如此?他们以身作则,用实际行动影响身边的人,规范了流程、提高了效能,使整个团队从中得益。这就是我们「递归」栏目的初心,记录平凡腾讯技术人的不平凡。 “35岁”、“职场焦虑”,技术人职业发展的话题近年来被越来越频繁地讨论。程序员该怎样选择适合自己的技术路线,如何构筑自己的核心竞争力,怎样面对即将到来的35岁? 带着这些问题,我们
腾讯技术工程官方号
2021/09/22
4830
解决 screen 连接不上
当您暂停screen,并希望下次重新连接screen时,有时会出现screen会话状态已连接但无法连接的情况。例如,我想重新输入会话id为18352的screen,运行“screen-r18352”,并提示“There is no screen to be resumed matching 18352”(没有screen要恢复匹配18352)。解决方案如下:
Erwin
2019/12/31
6.1K0
hikaripool连接保持,HikariPool-1 – 连接不可用,请求超时后[通俗易懂]
I’m using HikariCP 2.4.7 for connection pool. Everything is fine just after starting the application but after some time without invoking getConnection() I get this error when I’m trying to getConnection():
全栈程序员站长
2022/09/10
3.4K0
如何保持Ssh长时间连接不断开
新购入的华为云服务器SSH连接5分钟没有任何操作就自动断开了,该文章主要为了解决该问题,同样的场景适合各种云服务器/本地物理服务器等
cywhat
2022/11/22
4.6K0
如何保持Ssh长时间连接不断开
长时间保持ssh连接不断开的技巧
经常用ssh连接服务器的小伙伴, 可能会像我一样, 需要时不时地恢复一下断开的连接, 原因是NAT防火墙喜欢对空闲的会话进行超时处理,以确保它们状态表的干净和内存的低占用率, 简单说就是, 长时间保持连接, 会长期占用部分系统资源, 为了节省系统资源,NAT防火墙就会把长时间的ssh连接断掉,虽然问题不大, 但频繁重连ssh总归是有些麻烦
zhaoolee
2018/09/30
3.4K0
长时间保持ssh连接不断开的技巧
linux远程ssh连接不上?
昨天下午从公司下班回到家后,想连接linux来给一个docker项目部署好,发现突然连接不上了?
废江_小江
2022/09/05
22.6K0
linux远程ssh连接不上?
如何在断开连接后保持远程 SSH 会话运行
◆ 概述 SSH(Secure Shell)是端到端的加密网络系统,允许用户从客户端远程访问服务器。但有时由于不活动或网络信号不佳,SSH远程访问可能会断开连接。不管是什么原因,作为 Linux 管理员,在断开连接后保持 SSH 会话和进程运行是一项至关重要的工作。本文讨论断开连接后如何保持 SSH 会话运行。 ◆ 1. screen ---- 该screen命令是 SSH 管理最常用和最有用的命令。 对于 Ubuntu: $ sudo apt install screen 对于 OpenSUSE: $
IT大咖说
2022/04/13
4.3K0
如何在断开连接后保持远程 SSH 会话运行
redis 本地连接可以 远程连接不上问题
4.protected-mode yes 改为 protected-mode no(redis3.2版本以后)
全栈程序员站长
2022/07/08
8K0
socket.io初了解
server.js const express = require('express'); const app = express(); const http = require('http'); const server = http.createServer(app); const { Server } = require("socket.io"); const io = new Server(server); app.get('/', (req, res) => { res.sendFile(
用户4792657
2022/07/06
4650

相似问题

保持与Socket.io的连接

12

Socket.IO NestJS无法连接:保持断开连接/重新连接

145

Socket.io保持轮询以建立连接

11

socket.io连接事件不工作

32

Socket.io连接事件不触发

35
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档