在收集传递模型的ActionLink(Passing model in collection to

2019-10-21 20:13发布

我觉得这是一个非常基本的问题。 我试图实现的是显示对象为链接的集合。 当我点击一个链接,我想采取的是特定对象的详细信息。

我可以显示在索引视图项目链接的集合,但是当我点击一个项目的链接,我可以显示SingleProductView,但无法显示具体项目的变量存在。

是否有可能在特定项目传递给通过html.actionlink的看法? 或者说,是有可能的是具体项目传递到另一个动作,将显示一个看法?

该模型:

public class ProductModel
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public string ProductDescription { get; set; }
}

家庭控制器:

public class HomeController : Controller
{

    List<ProductModel> inventory = new List<ProductModel>() {
        new ProductModel { ProductName = "White T-Shirt", ProductDescription = "White T-Shirt", ListPrice = 10 },
        new ProductModel { ProductName = "Black T-Shirt", ProductDescription = "Black T-Shirt", ListPrice = 10 },
    };

    public ActionResult Index()
    {
        return View(inventory);
    }

    [HttpGet]
    public ActionResult SingleProductView()
    {
        return View();
    }
}

索引视图:

   @if(Model != null)
       {
            <ul>
            @foreach (ProductModel item in Model)
            {
                <li>
                    @Html.ActionLink(item.ProductName, "SingleProductView")
                </li>
            }
            </ul>
       }

Answer 1:

当你说return View(); ,你是不是传递一个模型。 它是空的。 因此,恢复模型(通常是从一个数据库,但在你的情况下,只需使用一个实例字段),并传递给视图。

[HttpGet]
public ActionResult SingleProductView(int id)
{
    //From the inventory, retrieve the product that has an ID that matches the one from the URL (assuming default routing)
    //We're using Linq extension methods to find the specific product from the list.
    ProductModel product = inventory.Where(p => p.ProductId == id).Single();

    //Send that product to the view.
    return View(product);
}

你的观点应该接受一个ProductModel为型号。

@* Declare the type of model for this view as a ProductModel *@
@model ProductModel

@* Display the product's name in a header. Model will be an instance of ProductModel since we declared it above. *@
<h2>@Model.ProductName</h2>

@* Display the product's description in a paragraph *@
<p>@Model.ProductDescription</p>

您不要将本产品从索引视图传递给其他视图,您通过ID在URL中,这将成为该行动方法的参数(假设你使用默认的路由)。 更改索引视图你的链接到这一点:

@Html.ActionLink(item.ProductName, "SingleProductView", new {Id = item.ProductId})

您的ProductModel说你有一个ProductId财产,不得ListPrice属性。 我认为你需要添加一个public double ListPrice {get; set;} public double ListPrice {get; set;}然后当你创建你的库存,分配的ID,例如:

List<ProductModel> inventory = new List<ProductModel>() {
    new ProductModel { ProductId = 1, ProductName = "White T-Shirt", ProductDescription = "White T-Shirt", ListPrice = 10 },
    new ProductModel { ProductId = 2, ProductName = "Black T-Shirt", ProductDescription = "Black T-Shirt", ListPrice = 10 },
};

用于访问产品为1的ID的URL应该(假定缺省的路由) /Home/SingleProductView/1

顺便说一句,您应该重命名ProductModelProduct 。 这使得它干净了一点。 并重新命名ProductName ,以Name 。 再看看区别: ProductModel.ProductName VS Product.Name 。 两者都同样明显,但一个是方式更简洁。



文章来源: Passing model in collection to actionlink