2012-06-01 225 views
3

我需要知道是否有方法将视图(Razor引擎)的模型(或其中的一部分,即后来的搜索查询)数据传递给控制器。MVC3(Razor)将模型数据从视图传递到控制器

为了以更好的方式是我必须做的解释,这就是兴趣代码:

VIEW:

@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”] = Model,CONTROLLER List movies = ViewData [“data”]),我同样尝试了一个TempData,我试着通过Model作为ActionLink中的routeValues(如您所见:new {id = Model.toList()}),但没有任何工作。

它甚至可以做我想要的东西吗?

任何人都可以帮助我吗?

回答

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> 

那是因为是呈现不类型的数据

解决方案

  1. 定义筛选模型再做搜索 (的jeremy-holovacs和我的建议)为什么要问到服务器再次相同的数据?因为如果有人分享那个链接...你能想象什么它的结果,即使注入您的应用程序会产生

  2. 串行化数据为JSON例如将其转发给控制器

+0

谢谢Zach dev。我会尝试你给我的第二个选项。 你可以请发表一个示例代码吗?谢谢。 – Jack88PD

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); 
} 
+0

很好的解释,正是我一直在寻找的假数据。投票:D – DaniKR

相关问题