繁体   English   中英

从 controller 发送消息以在 asp.net 核心 mvc 中查看的最佳方式

[英]Best way to send message from controller to view in asp.net core mvc

我正在使用 asp.net 核心 mvc(最新版本)。

我总是从 controller 发送我的消息(成功或失败消息),以便通过 TempData 查看,如下所示:

TempData["msg"] = "Operation was successful";

并在视图中向用户显示此消息:

@if (TempData["msg"] != null)
    {
        string msg = (string)TempData["msg"];
        <script>
            UIkit.notification({ message: '@msg', status: 'primary', pos: 'bottom-center', timeout: 15000 });
        </script>
    }

我想知道将此类消息从 controller 传递给查看的标准(最佳和优化)方式。

TempData 适合这种情况吗? 有没有更好的方法?

谢谢。

您通常通过“控制器”将“模型”发送到您的“视图”,这当然是 MVC 所代表的:

public class SendMessageModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    //... More stuff
}

//... inside controller
var model = new SendMessageModel()
{
    Id = 1,
    Name = "Name"
};

return View(model);

//... inside view
@model SendMessageModel


<span>@Model.Id @Model.Name</span>

但有时您需要向视图发送附加信息。 此数据不一定是 model 的一部分。 对于这种使用 ViewData 的场景是我的选择。

public async Task<ActionResult> Index(bool? error)
{
    if (error == true)
    {
        ViewData["Message"] = "Some error message";
    }

    //....
    return View();
}

//... inside view
@model SendMessageModel
@{
    var msg = ViewData["Message"];
}

@if(msg != null)
{
    <span class="error">@msg</span>
}

当然,这不是唯一的方式或“最好的方式”。 总有另一种方法可以做到这一点,这就是 Asp.Net Core 或一般编程的美妙之处。

创建一个 model 来表示您将在视图中显示的所有数据。

public class NewInvoiceViewData
{
    public Invoice Invoice { get; set; }
    public string Message { get; set; }
    public bool HasMessage => string.IsNullOrEmpty(Message) == false;
}

public async Task<ActionResult> CreateInvoice(NewInvoiceParameters parameters)
{
    var invoice = createInvoice.From(parameters);
    var message = invoice == null ? "Something gone wrong" : "Success";
    
    var viewData = new NewInvoiceViewData
    {
        Invoice = invoice,
        Message = message
    }

    return View(viewData);
}

在视图中

@if (@data.HasMessage)
{
    <script>
        UIkit.notification({ message: '@data.Message', status: 'primary', pos: 'bottom-center', timeout: 15000 });
    </script>
}

MVC(模型视图控制器)与应用程序分层无关。 Model 不需要是业务对象或数据库表。 请注意,如果不需要额外的值,它可以是业务 object 或数据库数据,但这不是强制性的。

Model 是一个 object 视图知道如何在没有额外解决方法的情况下显示,model 可以为视图准备所有需要和可能的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM