从链接向控制器发送对象

时间:2012-07-23 13:35:16

标签: asp.net-mvc

我的视图采用了类型

的模型
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)
        {}

如果我不必在查询字符串上传递List,我不想这样做。

寻找帮助修复我的代码以实现此目的

2 个答案:

答案 0 :(得分:0)

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

或者,您可以使用自定义动作过滤器或自定义模型绑定器as described here进行艰难的操作。

您尝试的方法不起作用的原因是,通过默认的模型绑定器,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)
}

答案 1 :(得分:0)

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

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

一般经验法则 - 仅提供所需内容