0

我有一个采用 Model 类型的视图

public class Product
{
    public string PartNumber { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }
    public string ImageUrl { get; set; }
    public List<Document> Documents { get; set; }

    public Product()
    {
        Documents = new List<Document>();
    }

}

单击以下链接时,我想调用控制器并以某种方式将 List 作为参数传递给控制器

 <a href="@Url.Action("Browse", "Home", new { docList= Model.Douments})" data-role="button" data-icon="search" class="my-btn">Available Documents</a>

   public ActionResult Browse(List<Documentr> docList)
        {}

如果我不必在我不想的查询字符串上传递列表。

寻求帮助修复我的代码以实现这一点

4

2 回答 2

0

您应该使用 ViewModel 来传递数据(最简单的方式)。

或者,您可以使用此处描述的自定义操作过滤器或自定义模型绑定器来执行此操作。

您尝试的方法不起作用的原因是 MVC 没有通过默认模型绑定器正确处理将 List 作为参数传递。


更新

自从看到您将列表更新为更大 Product 类的一部分后,我想知道为什么您不只是在目标操作中通过 id 引用该产品?(我不知道您的实体 Key 的名称是什么,但我会假设它是“ Id

你的链接会变成这样:

<a href="@Url.Action("DocumentList", "Home", new { id = Model.Id})" data-role="button" data-icon="search" class="my-btn">Available Documents</a>

你会有你的行动:

public ActionResult DocumentList ( int id )
{
    var product = db.Product.Find(Id);
    return View(product.List)
}
于 2012-07-23T13:42:03.253 回答
0

我认为你过于复杂了。我不明白您为什么要将只读数据发布到另一个控制器操作。这种方法的另一个问题是它有可能在点击链接时已经过时(可能性很小,但仍有可能)。另外,如果您的初始视图实际上没有显示任何文档,那么我会将其从模型中删除,因为它不是必需的,例如

public class ProductViewModel
{
    public int Id { get; set; }
    public string PartNumber { get; set; } 
    public string ShortDescription { get; set; } 
    public string LongDescription { get; set; } 
    public string ImageUrl { get; set; } 
}

public ActionResult Product(int id)
{
    var model = new ProductViewModel();
    ... // populate view model
    return new View(model);
}

然后在您的视图中,链接到您的产品进行浏览

@Html.ActionLink("Browse Documents", "Home", "Documents", new { id = Model.Id })

然后让您的Documents操作再次拉出产品,这次发送文件

public ActionResult Browse(int productId)
{
    var product = ... // get product by id
    return View(product.Documents);
}

一般经验法则 -只给视图它需要的东西

于 2012-07-23T14:31:59.070 回答