ASP.NET MVC & C#:将视图模型传递给控制器

Posted

技术标签:

【中文标题】ASP.NET MVC & C#:将视图模型传递给控制器【英文标题】:ASP.NET MVC & C# : pass a viewmodel to controller 【发布时间】:2019-12-05 15:53:27 【问题描述】:

我有一个控制器将视图模型传递给视图,并在视图中正确创建表。

然后在表的同一页面中,我有一个链接,可将用户重定向到另一个页面。

这个新页面需要保留前一个视图的视图模型。我怎么能做到?

在视图中,在表格页面中,此链接应重定向到EanMatch 控制器的操作:

@html.ActionLink("Inserimento manuale", "Index", "EanMatch",  null, new Vm = Model)

型号是这样的:

public List<DDTViewModel> DDTList  get; set; 

EanMatchControllerIndex 操作中我有:

[HttpGet]
public ActionResult Index(DDTListViewModel Vm)

    ....

我不明白为什么它不起作用。 DDTListViewModelIndex 中的 Vm 操作取 'null' 值,同时我通过调试看到 Model 获得了数据列表。

如何正确地将 viewmodel 传递给 action 参数?

有任何疑问,问!

【问题讨论】:

是.net core还是.net framework? 是.netframework 什么是 DDTListViewModel ?是客户端的安全存储吗? @staff614 您正在将 ViewModel 设置在匿名对象内的属性内。这就是为什么你没有得到你想要的结果。 @BasilKosovan DDTListViewModel 包含 viewModel 的列表 public List DDTList get;放; 【参考方案1】:

对于您的特定情况,您必须将模型序列化为 JSON 字符串,并将其发送到您的控制器以转换为对象。

这是你的ActionLink

@Html.ActionLink("Inserimento manuale", "Index", "EanMatch",  new  jsonModel= Json.Encode(Model.DDTListViewModel) , null)

您的 Controller 方法如下所示:

public ActionResult Index(string jsonModel)

  var serializer= new DataContractJsonSerializer(typeof(Model.DDTListViewModel));
  var yourmodel=  (DDTListViewModel)serializer.ReadObject(GenerateStreamFromString(jsonModel));

【讨论】:

【参考方案2】:

如果您的控制器名称是 EanMatch,那么下一个问题是我认为您正在将模型传递到它期望 htmlattributes 的位置。所以不是 null,而是 new Vm = Model;切换它们。

@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", new Vm = Model ,null )

【讨论】:

按 f12 并查看发送/获取的内容。 它作为查询字符串 ?Capacity=16&Count=11 发布,我实际上无法解释【参考方案3】:

您不需要创建匿名对象,只需传递您的视图模型:

@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, Model)

框架会将您的模型转换为将由您的控制器绑定的查询字符串。

【讨论】:

【参考方案4】:

试试这个:

@Html.ActionLink("Inserimento manuale", "Index", "EanMatch",  null,  Model)

或者: 对服务器的每个请求都有自己的上下文(线程),并且对其他请求一无所知。如果您需要在对服务器的几个不同请求之间共享模型或其他数据,您可以使用temp datasession。 在第一个动作中,您需要保存此模型:

Session["myModel"] = Model;

并阅读另一个:

var val = Session["myModel"];

【讨论】:

实际应该在哪里“Session[”myModel”] = Model;”去?它在视图到控制器之间,而不是动作到动作【参考方案5】:
@Html.ActionLink("LinkName", "Index", "EanMatchController", new ViewModel  Id = 1, Name = "Sth", Description = "Hello" , null);

您将对象设置为匿名对象的属性。 这就是为什么您的对象没有在控制器上传递的原因。

就像在你的对象周围有一个包装对象,如下所示。

public class Sth
 public ViewModel  get; set; 

所以 C# 不会将此识别为您的对象,您需要以某种方式在 razor 中创建它并将其发送回控制器。上面的代码有效。尝试一个简单的例子。

【讨论】:

它给“新视图模型”提供了错误。但是,我尝试输入 new id = 1 并将数据传递给操作,它只是不适用于 viewmodel 列表 传递你自己的视图模型。我只是发布了一个例子。视图模型是一个具有 3 个属性的对象。

以上是关于ASP.NET MVC & C#:将视图模型传递给控制器的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图

C# 和 ASP.NET MVC:在视图中使用 #if 指令

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

[MVC&Core]ASP.NET Core MVC 视图传值入门

如何在 ASP.NET MVC 视图中用 C# 打印出 GridView?

在 asp.net core 5 MVC 视图中从 C# 代码调用 JavaScript 函数