我需要知道是否有办法将View(Razor Engine)的Model(或其中一部分,即此后的搜索查询)数据传递给Controller。
为了更好地解释我必须做的事情,那就是感兴趣的代码:
查看:
@model IEnumerable<MvcMovie.Models.Movie>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
...
@foreach (var item in Model) { ...}
...
@Html.ActionLink("Search", "SearchIndex")
@Html.ActionLink("Create Document", "createDoc"/*, new { id = Model.ToList() }*/)
我想传递
@model IEnumerable<MvcMovie.Models.Movie>
在第一行(= foreach指令中使用的模型)中,向Controller“createDoc”创建一个与视图动态绑定的报表文档。
我尝试了一切:我尝试使用ViewData(VIEW:ViewData [“data”] =模型,CONTROLLER列表movies = ViewData [“data”]),我同样尝试了TempData,我试图将模型传递为ActionLink中的routeValues(如你所见:new {id = Model.toList()}),但没有任何效果。
甚至可以做我想做的事情吗?
任何人都可以帮助我吗?
答案 0 :(得分:2)
您的模型不应该是IEnumerable<MvcMovie.Models.Movie>
它应该是一个类SearchMovieModel
,其IEnumerable<MvcMovie.Models.Movie> Movies
作为其属性之一。
如果你想要一个搜索模型,这样的东西是合适的:
public class SearchMovieModel{
public IEnumerable<MvcMovie.Models.Movie> Movies {get;set;}
public string SearchString {get;set;}
}
您在视图和控制器中引用此模型及其属性。
我想我应该在控制器中添加解析它的方法。
在第一次调用视图时,模型不存在。您需要在控制器中创建它:
public ActionResult Search(){
var model = new SearchMovieModel();
//you also need to instantiate the null objects unless you do that in the model's constructor
model.Movies = new List<Movie>();
return View(model);
}
要将POST数据“重新转换”回模型,您需要指定模型和方法:
[HttpPost]
public ActionResult Search(SearchMovieModel model){
if (ModelState.IsValid){
//populate your IEnumerable<Movie> here.
return View(model);
}
// the complex collection will not be parsed back into the model. You will need to repopulate it.
model.Movies = new List<Movie>();
return View(model);
}
答案 1 :(得分:1)
我认为你知道你想要什么...但是这个代码是白色的
@Html.ActionLink("Create Document", "createDoc", new { id = Model.ToList() })
你的HTML是......
<a href="/test/createDoc?id=System.Collections.Generic.List%601%5BMvcMovie.Models.Movie%5D">Create Document</a>
那是因为渲染类型而不是数据
解决方案
定义过滤器模型再次进行搜索(jeremy-holovacs和我的推荐) 为什么要再次向服务器询问相同的数据?因为如果有人分享了这个链接......你可以想象,结果甚至会注入你的应用会生成的虚假数据
将数据序列化为json,例如将其转发给控制器