将输入值从控制器传递到 MVC 中的视图

Posted

技术标签:

【中文标题】将输入值从控制器传递到 MVC 中的视图【英文标题】:Passing the input value from controller to view in MVC 【发布时间】:2022-01-12 05:50:37 【问题描述】:

我是 ASP.NET Core MVC 的新手。我想将文本字符串从控制器移动到视图。这是我的控制器。

public class CalculatorController : Controller

    public string text= "";

    public IActionResult Index()
    
        ViewData["Text"] = text;
        return View();
    

    public IActionResult Button1_Click(string button)
    
        text += button;
        return RedirectToAction("Index");
    

    public IActionResult Button2_Click(string button)
    
        text = text + button;
        return RedirectToAction("Index");
    

在控制器中,我创建了一个公共字符串文本,其中存储了按钮值button1_Click,它存储它的值并显示在输入文本框中,当Button2_Click 它存储并显示按钮1 的值和输入文本框中的 button2。

输入文本框标记在这里:

<input type="text" asp-controller="Calculator" asp-action="Index"  
       value="@ViewBag.Text" class="form-control" />

但是这段代码效果不好。

【问题讨论】:

我不确定这个 MVC 是做什么的。例如,如果我点击 Button1 两次会显示什么? 你可以在return xxx行设置断点,你会发现ViewData["Text"]之间并没有保持值,所以只能设置完整的值。 【参考方案1】:

您需要考虑到,当您执行操作方法public IActionResult Index() 时,您的控制器类有一个实例。但是在从视图中发布一个新的文本值之后,控制器类的一个新实例将被创建。为了看到这一点,我添加了控制器类哈希码的打印:Debug.WriteLine("[HttpGet] This is: " + this.GetHashCode());

这就是为什么你的代码中的这个操作符text += button; 不能像你预期的那样工作。

为了在请求之间保留文本,在此示例中,使用了TempData

控制器中的代码片段:

public IActionResult Index()
   
    System.Diagnostics.Debug.WriteLine("[HttpGet] This is: " + this.GetHashCode());
    TempData["TextData"] = "Hello World!";
    return View();


[HttpPost]
public IActionResult Index(string data)

    System.Diagnostics.Debug.WriteLine("[HttpPost] This is: " + this.GetHashCode());
 
    TempData["TextData"] += data;
    ModelState.Remove("data"); // The context clean up 
    return View("Index");

观点Index.cshtml

@
    var data = TempData["TextData"];   


@using (Html.BeginForm("Index", "Calculator"))

    <input type="text" asp-for="@data" />
    TempData.Keep("TextData"); // To preserve the data at the end of the request

有关更多信息,请参阅以下帖子:Session and state management in ASP.NET Core

【讨论】:

哦,谢谢!!但是当我点击button1时比Button1_Click中的文本字符串值为1,但是在RedirectToAction("Index")之后,比索引动作方法中的文本字符串值为Null。 @Shahriyar Rahim:查看更新后的答案。谢谢。【参考方案2】:

在我看来,如果你只需要将按钮的文本值附加到你的输入框,你甚至不需要向你的后端控制器发出请求,除非你需要做一些其他的操作。如果是这样,我建议您在这里使用 ajax 仅将按钮文本字符串发送到您的控制器,然后您可以在成功回调函数中做一些这样的事情:

public IActionResult Index()

    ViewData["Text"] = "asdf";
    return View();


public string Button1(string button)

    // do your own business here
    return text;


public string Button2(string button)

    // do your own business here
    return text;

而在cshtml文件中,

<input type="text" id="input1" value="@ViewBag.Text " />
<a href="#" id="ccc">ccc</a>
<a href="#" id="ddd">ddd</a>

<script>
    $("#ccc").click(function () 
        $.ajax(
            url: "https://localhost:44372/home/Button1",
            type: "get",
            data: 
                button: "ccc"
            ,
            success: function (data) 
                $("#input1").val($("#input1").val() + data);
            
        );
    );

    $("#ddd").click(function () 
        $.ajax(
            url: "https://localhost:44372/home/Button1",
            type: "get",
            data: 
                button: "ddd"
            ,
            success: function (data) 
                $("#input1").val($("#input1").val() + data);
            
        );
    );
</script>

【讨论】:

以上是关于将输入值从控制器传递到 MVC 中的视图的主要内容,如果未能解决你的问题,请参考以下文章

在 Asp.net MVC 中将值从视图传递到控制器

如何使用 Asp.net MVC Razor 将隐藏字段值从一个控制器传递到另一个控制器

如何将模型值从视图传递到控制器?

将值从模型传递到 CI 中的视图

将值从一个视图控制器传递到另一个视图控制器的问题

通过 Laravel 中的 AJAX 发布请求将值从一个视图传递到另一个视图