【问题标题】:How can I pass the same id value between multiple views?如何在多个视图之间传递相同的 id 值?
【发布时间】:2021-12-06 20:43:20
【问题描述】:

我有一个产品列表页面,其中包含一个没有主导航的产品列表

View 链接单击上面的Product List 页面时,我可以导航到Overview 页面,正确传递所选产品ID,但是当我从主导航单击供应商链接时,我想传递相同的id 值作为供应商页面的概览页面,因为一旦我单击查看链接,所有内容都与所选产品有关。处理这个问题的最佳方法是什么?我尽量避免使用TempDataSession

_Navigation.cshtml 如下图所示

<nav id="navigation" class="main-navigation">
    <ul id="nav_list" class="top-level-nav">
        <li class="nav-item">
            <a href="/" class="first-level-link">Overview</a>
        </li>
        <li class="nav-item">
            <a asp-action="Index" asp-controller="Supplier" asp-area="Supplier">Suppliers</a>
        </li>        
    </ul>
</nav>

概览操作

    [HttpGet]       
    public async Task<IActionResult> Overview(int id)
    {
        var productInfo = await _productService.GetProductDetailsByID(id);
        var productDTO = _mapper.Map<ProductOverview>(productInfo);         

        return View(productDTO);
    }

产品概览视图模型

 public class ProductOverview
 {
   public int ID { get; set; }
   public string ProductCode { get; set; }
   public string Type{ get; set; }
   public string ProductName { get; set; }
 }

供应商行动

[HttpGet]
public async Task<IActionResult> Index(int id)
{
var suppliers= await _suppliersService.GetAllSuppliers(3); //need help pass the selected productID
var suppliersDTO = _mapper.Map<Suppliers>(suppliers);         

return View(suppliersDTO);
}

供应商视图模型

public class Supplier
{
    public int ID { get; set; }
    public int ProductID { get; set; }
    public string SupplierName { get; set; }        
 }

【问题讨论】:

  • 既然你展示了你应该展示的概述动作,那么概述视图。或显示导航动作、模型和类请

标签: asp.net asp.net-mvc asp.net-core


【解决方案1】:

如果您的 Overview 和 Supplier 视图正在处理 Navigation as the layout,或者 Navigation 被呈现为布局的一部分,则一种选择是创建一个基础或抽象模型类,您的外部布局 (and the navigation partial view,如果它是分开)消费。

例如,您可能有这样的类:

public abstract class LayoutBaseClass 
{
    public abstract int ProductId { get; }
}

然后,您的 ProductOverview 和 Supplier 类可以从这个基类派生。布局视图可以依赖抽象/基类模型,使这些共享属性可用于布局,因此您可以将它们包含在导航中生成的 URL 中,而更细粒度的视图可以继续引用更具体的类.返回视图时,您无需更改控制器中的任何内容,在这种情况下,ASP .NET Core 会将模型传播到布局和视图中。

【讨论】:

  • 如何使 LayoutBaseClass > productId 获取从 ProjectList 页面传递的选定产品 ID 我不断收到空异常错误 System.NullReferenceException: 'Object reference not set to an instance of an object.' in &lt;a asp-action="Index" asp-controller="Supplier" asp-area="Supplier" asp-route-id="@Model.ProductId"&gt;Suppliers&lt;/a&gt;
  • 如果您在布局中包含基类,那么所有使用它作为布局的视图必须在视图旁边返回一个模型,即使是在 GET 调用中即使它处于某种“默认”状态,否则您将遇到空引用。如果存在默认状态(即 productid == 0),您可以决定有条件地呈现导航项。该值不会自动从您的项目列表链接进入模型,它必须在每次返回新模型的渐进式调用中分配给模型(即概览 GET 在其模型中返回它,供应商 GET 接收它并返回它)
  • 或者,您可以使用不同版本的布局,一个不需要模型(默认状态,不预先假定选择),另一个用于适用的视图。
猜你喜欢
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多