C# ASP.NET MVC:动态更新视图

Posted

技术标签:

【中文标题】C# ASP.NET MVC:动态更新视图【英文标题】:C# ASP.NET MVC : update view dynamically 【发布时间】:2021-10-08 21:01:59 【问题描述】:

我正在学习 C#,使用 DotNetFiddle 进行编码。

我有一个带有一堆单选按钮的网络,当我单击它们时,我想更新视图,例如:删除一个按钮。

我还需要在后端执行删除逻辑,从视图中我必须调用 POST 方法来传递数据。

所以我尝试使用 ajax 调用 POST 方法并返回 RedirectToAction 以显示新视图,但不知何故不起作用。

你可以在这里检查和测试我当前的代码:dotnetfiddle

控制器

using System;
using System.Web.Mvc;
using System.Collections.Generic;

namespace HelloWorldMvcApp

    public class HomeController : Controller
    
        public SampleViewModel sampleViewModel = new SampleViewModel();
        
        [HttpGet]
        public ActionResult Index()
           
            return View(sampleViewModel);
        
        
        [HttpPost]
        public ActionResult UpdateList(string id)
        
            sampleViewModel.deleteElement();
            return RedirectToAction("Index");
        
    

型号

using System;
using System.ComponentModel.DataAnnotations;

namespace HelloWorldMvcApp

    public class SampleViewModel
           
        public List<string> list = new List<string>  "a", "b", "c", "d", "e" ;
    

查看

@model HelloWorldMvcApp.SampleViewModel
@
    Layout = null;


<!DOCTYPE html>
<!-- template from http://getbootstrap.com/getting-started -->

<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Bootstrap 101 Template</title>

        <!-- CSS Includes -->
        <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
    </head>
    
    <body>
        <br/>
        <div class="container">
            
            <br></br>
            <ul>
            @foreach (var c in Model.arr)
            
                <li>
                    <input type="radio" name="option" id="@c">@c
                </li>
            
            </ul>
            
        </div>

        <!-- JS includes -->
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
        <script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
    
        <script src="//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
        <script src="//ajax.aspnetcdn.com/ajax/mvc/4.0/jquery.validate.unobtrusive.min.js"></script>
        <script type="text/javascript">
            
                $('input[type=radio]').click(function() 
                    var elemId = $(this).attr("id");
                    $.ajax(
                        url: '@Url.RouteUrl(new action="UpdateList", controller="Home")',
                        data:  id : elemId ,
                        type: "POST"
                    );     
                );
            
        </script>
    </body>
</html>

【问题讨论】:

您的代码不起作用,因为您实际上并未将 id 传递给您的删除方法。所以它每次都会加载完整的循环。 @Greg delete 方法没有任何参数,所以我不用传递Id @mason 感谢您的建议,现在我要添加它。 @Kaido 但你怎么知道删除什么?您还可以重定向到新创建的模型。 @Greg 这是一个例子,我不在乎它是否没有逻辑我只想更新视图。 【参考方案1】:

更新

我已将您的 Fiddle 编辑为:https://dotnetfiddle.net/zQq3aR

它完全按照我在原始答案中的描述进行,但使用主视图。请注意,这不是我推荐的……我们再次渲染整个视图,然后用新内容替换 整个 页面内容,但我对 DotNetFiddle 和不知道如何添加更多视图(可以吗?)。

C#:

[HttpPost]
public ActionResult PostToMe(string id)

    // TODO: Do some stuff here, then return the updated view
    
    return ButRenderMe(id);


[HttpPost]
public ActionResult ButRenderMe(string id)

    // Remove some content from the model
    sampleViewModel.arr = new []  "a", "b", "c", "all of the above" ;
    
    return View(sampleViewModel);

JavaScript:

$.ajax(
    url: '@Url.RouteUrl(new action="PostToMe", controller="Home")',
    data:  id : elemId ,
    type: "POST",
    success: function(data) 
        document.open();
        document.write(data);
        document.close();
    
);

在普通 MVC 项目中执行此操作的更好方法是使用 PartialView 来呈现要替换的内容...在本例中为列表。在您的“更新”操作中,您将更新您的数据,然后仅重新渲染该 PartialView 并返回它。然后只用新内容替换该部分。

使用上面的代码,来自我的 Fiddle,我们还不如做一个普通的页面发布,而不是一个 AJAX 调用。

这里有很多因素,但希望这会有所帮助。

原始答案

所以这有点令人困惑,因为您的问题与 DotNetFiddle 中的代码或问题本身都不匹配,但让我们看看这是否有帮助。

我很确定返回 RedirectToAction Result 不会返回您重定向到的其他操作的内容。我认为在这种情况下,由于它是一个 AJAX 请求,MVC 知道这不是正确的用法,并返回 200 OK 状态和以下示例内容。所以有了这个控制器动作:

[HttpPost]
public ActionResult RedirectMe()

    return RedirectToAction("UpdateList");

我们得到这个响应:

<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/MvcPageAction/d5a71d77-e4c6-4b4c-a400-4543b1a9f897/Home/UpdateList">here</a>.</h2>
</body></html>

再说一次,我认为这不会像你想要的那样工作。

认为你想要的是渲染另一个动作,然后返回那个内容。这应该像调用其他操作一样简单:

[HttpPost]
public ActionResult PostToMe(string id)

    return ButRenderMe(id);


[HttpPost]
public ActionResult ButRenderMe(string id)

    return Content("Test");

返回内容“test”。我认为如果你愿意,你应该能够在其他操作中呈现普通视图。

我也看了你的 DotNetFiddle...

在您的 DotNetFiddle 中,您的 JavaScript 正在调用似乎不存在的 UpdateList...不知道为什么它甚至会返回 200 OK...您拥有的操作是 Index 和 UpdateFlights。如果您在 Chrome 中打开 F12 开发人员工具,您应该会看到 POST 没有返回任何内容。

所以我添加了一个名为 UpdateList 的控制器操作:

[HttpPost]
public ActionResult UpdateList(string id)

    sampleViewModel.deleteElement();
    return Content("Test");

我可以看到“测试”作为 F12 工具中的响应内容返回。

【讨论】:

感谢您的回答。由于拼写错误,我没有 UpdateList,现在它是正确的。我试过你的建议它不起作用,按钮没有被删除。换句话说,我想要的是通过单击按钮动态更新当前视图,但删除逻辑必须在后端。 @Kaido 我已经用我自己的 Fiddle 和更多信息更新了答案。

以上是关于C# ASP.NET MVC:动态更新视图的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 中从部分视图发布动态表单数据

asp.net mvc 3 和动态视图生成

asp.net MVC动态路由

ASP.NET MVC 如何从嵌套对象的视图模型集合中动态创建表结构

在 Asp.net C# 中创建动态控件,并缓存控件并绑定数据

ASP.NET MVC 网站视图模型在发布后未更新,但在发布中运行良好