MVC3(Razor):如何从视图传递模型数据到控制器

3

我需要知道是否有一种方法可以将视图(Razor Engine)的模型数据(或其中的一部分,即搜索查询之后)传递给控制器。

为了更好地解释我要做的事情,这是相关代码:

视图:

@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指令中使用的第一行(=在“createDoc”控制器中使用的模型),以动态绑定视图的报告文档形式创建。我尝试了很多方案:我试着使用ViewData(视图:ViewData["data"]=Model,控制器List movies= ViewData["data"]),类似地我也试着用TempData,还用Model作为ActionLink中路由值来传递(如您所见:new{id=Model.toList()}),但都没奏效。我想知道我想要的事情是否可行,有人能帮帮我吗?
2个回答

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

我认为我知道你想要什么...但是用这段代码

@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格式,例如将其转发到控制器


谢谢 Zach dev。我会尝试你给我的第二个选项。 你能否提供一个示例代码?谢谢。 - Jack88PD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接