【问题标题】:How do I perform the following sql query with an ActionLink MVC 5?如何使用 ActionLink MVC 5 执行以下 sql 查询?
【发布时间】:2014-12-21 06:39:13
【问题描述】:

是否可以单击一个actionlink 名称并让它检索相关记录,就像下面的sql 语句一样? CustomerName html 链接 --> 转到客户详细信息视图的索引,仅检索与客户名称 (CustomerNameID) 关联的记录。

SELECT dbo.CustomerName.CustomerNameName, dbo.CustomerDetail.CustomerNameID
FROM dbo.CustomerDetail INNER JOIN
     dbo.CustomerName ON dbo.CustomerDetail.CustomerNameID = dbo.Cust

型号:客户名称

 public partial class CustomerName
    {
        public CustomerName()
        {
            this.CustomerDetails = new HashSet<CustomerDetail>();
            this.CustomerEquipments = new HashSet<CustomerEquipment>();
            this.CustomerHealthChecks = new HashSet<CustomerHealthCheck>();
        }

        public int CustomerNameID { get; set; }
        public Nullable<int> CustomerHealthCheckID { get; set; }
        public Nullable<int> CustomerEquipmentID { get; set; }
        public int MasterLicNum { get; set; }
        public string CustomerNameName { get; set; }
        public Nullable<int> Active { get; set; }

        public virtual CustomerDetail CustomerDetail { get; set; }

        public virtual ICollection<CustomerDetail> CustomerDetails { get; set; }
        public virtual ICollection<CustomerEquipment> CustomerEquipments { get; set; }
        public virtual ICollection<CustomerHealthCheck> CustomerHealthChecks { get; set; }
    }
}

型号:客户详情

public partial class CustomerDetail
    {
        public CustomerDetail()
        {
            this.CustomerNotes = new HashSet<CustomerNote>();
        }

        public int CustomerDetailID { get; set; }
        public int CustomerNameID { get; set; }
        public System.DateTime DateUpdated { get; set; }
        public System.DateTime DateCreated { get; set; }
        public int CustomerPriorityID { get; set; }
        public int CustomerStatusHealthID { get; set; }
        public Nullable<int> EquipmentID { get; set; }
        public Nullable<int> CustomerHealthCheckID { get; set; }
        public int LREngineerID { get; set; }
        public int CustomerEngineerID { get; set; }
        public string Description { get; set; }
        public byte[] RowVersion { get; set; }

        public virtual CustomerEngineer CustomerEngineer { get; set; }
        public virtual CustomerName CustomerName { get; set; }
        public virtual CustomerPriority CustomerPriority { get; set; }
        public virtual CustomerStatusHealth CustomerStatusHealth { get; set; }
        public virtual LREngineer LREngineer { get; set; }
        public virtual ICollection<CustomerNote> CustomerNotes { get; set; }
    }
}

控制器:

return View(CustomerName.ToPagedList(pageNumber, pageSize));

查看:

@Html.ActionLink(item.CustomerNameName.ToString(), "Index", "CustomerDetail", new {ID = item.CustomerNameID }, null)

路线:

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapMvcAttributeRoutes();
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "CustomerName", action = "Index", id = UrlParameter.Optional }

我重建了我的控制器来清理它。它是目前开箱即用的标准控制器。 CustomerNameController 索引():

// GET: CustomerName
public async Task<ActionResult> Index(int? CustomerNameID = null)
{
    return View(await db.CustomerNames.ToListAsync());
}

// GET: CustomerName/Details/5
public async Task<ActionResult> Details(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    CustomerName customerName = await db.CustomerNames.FindAsync(id);
    if (customerName == null)
    {
        return HttpNotFound();
    }
    return View(customerName);
}

CustomerDetailController 索引():

  public async Task<ActionResult> Index(string sortOrder, string currentFilter, string searchString, int? page)
        {
            var customerDetails = db.CustomerDetails.Include(c => c.CustomerEngineer).Include(c => c.CustomerName).Include(c => c.CustomerPriority).Include(c => c.CustomerStatusHealth).Include(c => c.LREngineer);
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

            if (searchString != null)
            {
                page = 1;
            }
            else
            {
                searchString = currentFilter;
            }

            ViewBag.CurrentFilter = searchString;
             var CustomerDetails = from s in db.CustomerDetails
                           select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                CustomerDetails = CustomerDetails.Where(s => s.Description.Contains(searchString));
            }
            switch (sortOrder)
           {
                case "name_desc":
                    CustomerDetails = CustomerDetails.OrderByDescending(s => s.CustomerNameID);
                    break;
                case "Date":
                    CustomerDetails = CustomerDetails.OrderBy(s => s.DateUpdated);
                    break;
                case "date_desc":
                    CustomerDetails = CustomerDetails.OrderByDescending(s => s.DateUpdated);
                    break;
                default:  // Name ascending 
                    CustomerDetails = CustomerDetails.OrderBy(s => s.CustomerNameID);
                    break;
            }

            int pageSize = 15;
            int pageNumber = (page ?? 1);

            //return View(await customerDetails.ToListAsync());
            return View(CustomerDetails.ToPagedList(pageNumber, pageSize));
        }

我们将不胜感激。这甚至可能吗?

【问题讨论】:

  • 当然。显示CustomerDetailController 的Index() 方法(尽管我怀疑您确实需要另一种方法(比如Details(int ID) 返回显示详细信息的视图)
  • 您的@Html.ActionLink() 正在调用CustomerDetailController 的Index() 方法并将CustomerNameID 传递给它,但该方法需要参数string sortOrder, string currentFilter, string searchString, int? page。由于您令人困惑的命名约定,很难理解这一点,但我怀疑它应该是 @Html.ActionLink(item.CustomerNameName.ToString(), "Detail", "CustomerName", new {ID = item.CustomerNameID }, ...)

标签: c# asp.net-mvc razor-2


【解决方案1】:

答案很简单,但我没能理解。多次运行该程序后,我注意到正在传递 CustomerName/Index ID,但 CustomerDetail/Index 未能将其拾取并过滤结果。我添加了以下代码,它终于奏效了。谢谢大家的帮助。

        // GET: CustomerDetail
    public async Task<ActionResult> Index(int CustomerNameID)
    {

        IQueryable<CustomerDetail> CustomerDetail = db.CustomerDetails
           .Where(c => c.CustomerNameID == CustomerNameID)
           .OrderBy(d => d.CustomerNameID)
           .Include(d => d.CustomerName);


        return View(await CustomerDetail.ToListAsync());
    }

【讨论】:

    【解决方案2】:

    编辑

    SELECT dbo.CustomerName.CustomerNameName, dbo.CustomerDetail.CustomerNameID
    FROM dbo.CustomerDetail INNER JOIN
         dbo.CustomerName ON dbo.CustomerDetail.CustomerNameID = dbo.Cust
    

    在 LINQ 中:

    var query = from detail in CustomerDetails
                //from name in CustomerNames.Where(r=>r.CustomerDetail == detail)
                from name in CustomerNames.Where(r=>r.CustomerNameID == detail.CustomerNameID)
                select new {CustomerName = name.CustomerName, CustomerNameId = detail.CustomerNameId}
    

    关闭

    如果您想在同一页面上显示详细信息,请修改Index 操作。创建一个包含客户列表和详细信息对象的模型。

    检查输入参数是否为空,如果是则仅返回客户列表。如果参数不为空,则返回包含客户详细信息的客户列表。

    public ViewResult Index(int? customerId = null)
    {
        if(cusomerId == null)
        {
            return new IndexModel {Customers = customersList};
        }
        else
        {
            return new IndexModel {Customers = customersList, Details = getDetailsById(customerId)};
        }
    }
    

    模型示例:

    public class IndexModel
    {
        public List<Customer> Customers {get;set;}
        public CustomerDetails Details {get;set;}
    }
    

    动作链接:

    @Html.ActionLink(item.CustomerNameName.ToString(), "Index", "CustomerDetail", new {customerId = item.CustomerNameID }, null)
    

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多