ASP.NET MVC 和 C#:将视图模型传递给控制器
ASP.NET MVC & C# : pass a viewmodel to controller
我有一个将视图模型传递给视图的控制器,并且在视图中它正确地创建了 table。
然后在 table 的同一页面中,我有一个 link 将用户重定向到另一个页面。
这个新页面需要保留之前视图的viewmodel。我该怎么做?
在视图中,在 table 页面中这个 link 应该重定向到 EanMatch
控制器的操作:
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, new {Vm = Model})
型号是这样的:
public List<DDTViewModel> DDTList { get; set; }
在 EanMatchController
和 Index
操作中我有:
[HttpGet]
public ActionResult Index(DDTListViewModel Vm)
{
....
}
我不明白为什么它不起作用。 DDTListViewModel
Index
动作中的 Vm 取 'null' 值,同时我在调试中看到模型获得了数据列表。
如何将 viewmodel 正确传递给 action 参数?
如有疑问,请咨询!
如果您的控制器名称是 EanMatch,那么下一个问题是我认为您正在将模型传递到它需要 html 属性的地方。所以 new {Vm = Model} 而不是 null;切换它们。
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", new {Vm = Model} ,null )
试试这个:
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, Model)
或:
对服务器的每个请求都有自己的上下文(线程)并且对其他请求一无所知。如果您需要在对服务器的几个不同请求之间共享模型或其他数据,您可以使用 temp data
或 session
。
在第一个动作中,您需要保存此模型:
Session["myModel"] = Model;
再读一遍:
var val = Session["myModel"];
您不需要创建匿名对象,只需传递您的视图模型:
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, Model)
该框架会将您的模型转换为将由您的控制器绑定的查询字符串。
@Html.ActionLink("LinkName", "Index", "EanMatchController", new ViewModel { Id = 1, Name = "Sth", Description = "Hello" }, null);
您将对象设置为 属性 为匿名对象。
这就是您的对象未传递到控制器的原因。
这就像在你的对象周围有一个包装对象,如下所示。
public class Sth{
public ViewModel { get; set; }
}
因此 C# 无法将此识别为您的对象,您需要以某种方式在 razor 中创建它并将其发送回控制器。上面的代码有效。尝试一个简单的例子。
对于您的特定情况,您必须将您的模型序列化为 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));
}
我有一个将视图模型传递给视图的控制器,并且在视图中它正确地创建了 table。
然后在 table 的同一页面中,我有一个 link 将用户重定向到另一个页面。
这个新页面需要保留之前视图的viewmodel。我该怎么做?
在视图中,在 table 页面中这个 link 应该重定向到 EanMatch
控制器的操作:
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, new {Vm = Model})
型号是这样的:
public List<DDTViewModel> DDTList { get; set; }
在 EanMatchController
和 Index
操作中我有:
[HttpGet]
public ActionResult Index(DDTListViewModel Vm)
{
....
}
我不明白为什么它不起作用。 DDTListViewModel
Index
动作中的 Vm 取 'null' 值,同时我在调试中看到模型获得了数据列表。
如何将 viewmodel 正确传递给 action 参数?
如有疑问,请咨询!
如果您的控制器名称是 EanMatch,那么下一个问题是我认为您正在将模型传递到它需要 html 属性的地方。所以 new {Vm = Model} 而不是 null;切换它们。
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", new {Vm = Model} ,null )
试试这个:
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, Model)
或:
对服务器的每个请求都有自己的上下文(线程)并且对其他请求一无所知。如果您需要在对服务器的几个不同请求之间共享模型或其他数据,您可以使用 temp data
或 session
。
在第一个动作中,您需要保存此模型:
Session["myModel"] = Model;
再读一遍:
var val = Session["myModel"];
您不需要创建匿名对象,只需传递您的视图模型:
@Html.ActionLink("Inserimento manuale", "Index", "EanMatch", null, Model)
该框架会将您的模型转换为将由您的控制器绑定的查询字符串。
@Html.ActionLink("LinkName", "Index", "EanMatchController", new ViewModel { Id = 1, Name = "Sth", Description = "Hello" }, null);
您将对象设置为 属性 为匿名对象。 这就是您的对象未传递到控制器的原因。
这就像在你的对象周围有一个包装对象,如下所示。
public class Sth{
public ViewModel { get; set; }
}
因此 C# 无法将此识别为您的对象,您需要以某种方式在 razor 中创建它并将其发送回控制器。上面的代码有效。尝试一个简单的例子。
对于您的特定情况,您必须将您的模型序列化为 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));
}