简体   繁体   English

从控制器返回ASP.Net MVC多个列表

[英]ASP.Net MVC multiple list return from Controller

I am working with the mvc4 razor, this is the first model code 我正在使用mvc4剃须刀,这是第一个模型代码

public class WebLicenses
{
    public string WebLicenseName { get; set; }
    public int CustomerWebLicensesCount { get; set; }
}

public class WebApplication
{
    public string WebApplicationName { get; set; }
    public int Count { get; set; }

    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}")]
    public DateTime? EndDate { get; set; }

    public string Never { get; set; }
}
public class griddetail
{
    public griddetail( List<WebLicenses> wl1,List<WebApplication> wa1 )
    { 
        wl =wl1;
        wa = wa1;
    }
    //public List<WebLicenses> wl2 { get; private set; }

    public List<WebLicenses> wl { get; set; }
    public List<WebApplication> wa { get; set; }

}

this is my second model code which uses the first model code as (here stored procedure return 2 table - WebLicenses, WebApplication (In below code error comes --commented) 这是我的第二个模型代码,它使用第一个模型代码作为(这里存储过程返回2表-WebLicenses,WebApplication(下面的代码错误--commented)

public IEnumerable GetOutlookGridDetail(string customerId = "")
{
        List<WebLicenses> weblicenses = new List<WebLicenses>();
        List<WebApplication> webapplication = new List<WebApplication>();            
        griddetail returnValue = new griddetail(weblicenses, webapplication);          

        SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["SLIMConnectionString"].ConnectionString);
        SqlCommand cmd = new SqlCommand("selectCustomerDetail", cn);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter param_CustomerID = new SqlParameter("@CustomerID", SqlDbType.VarChar, 10);
        param_CustomerID.Value = customerId;
        cmd.Parameters.Add(param_CustomerID);

        try
        {
            cn.Open();

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                WebLicenses newRecord = new WebLicenses();
                newRecord.WebLicenseName = Convert.ToString(reader["WebLicenseName"]);
                newRecord.CustomerWebLicensesCount = Convert.ToInt32(reader["CustomerWebLicensesCount"]);
                //returnValue.Add(newRecord);
                weblicenses.Add(newRecord);                    
            }

            reader.NextResult();

            while (reader.Read())
            {
                WebApplication newRecord = new WebApplication();

                newRecord.WebApplicationName = Convert.ToString(reader["WebApplicationName"]);
                newRecord.Count = Convert.ToInt32(reader["Count"]);
                newRecord.Never = Convert.ToString(reader["Never"]);
                webapplication.Add(newRecord);
            }
            returnValue.wl.Add(weblicenses); //here comes error (Argument 1: cannot convert from 'System.Collections.Generic.List<SLIM.Models.WebLicenses>' to 'SLIM.Models.WebLicenses')
        }
        catch (Exception)
        {
            // returnValue = null;
        }
        finally
        {
            cmd.Dispose();

            if (cn.State == ConnectionState.Open)
            {
                cn.Close();
            }
        }

        return returnValue;
}

this is my controller code. 这是我的控制器代码。

    [HttpPost]
    public ActionResult GridViewPartialView(string recordId)
    {
        IEnumerable result1 = (new SlimHomePageData()).GetRecords(recordId, "");
        IEnumerable result2 = (new SlimHomePageData()).GetRecords();
        List<object> finalResult = new List<object>();
        finalResult.Add(result1);
        finalResult.Add(result2);
        return PartialView("OutlookGridDetail", finalResult);            
    }

I want to return a single list which consists 2 lists (but above error comes). 我想返回一个包含2个列表的列表(但出现上述错误)。 Also suggest, Is this right approach as stored procedure return multiple tables and we want to set value in view via a model. 还建议“这种方法正确吗,因为存储过程返回多个表,我们希望通过模型在视图中设置值”。

I forgot to give answer, but yesterday somebody gives minus vote. 我忘了回答,但是昨天有人给了我零下的票。 Yes its too long time. 是的,时间太长。 What I did (I again explain everything to understand more) : 我做了什么(我再次解释了所有内容以进一步了解):

Step1: Define the 2 class as 步骤1:将2类定义为

public class WebLicenses
    {
        public int WebLicenseID { get; set; }
        public string WebLicenseName { get; set; }
        public int CustomerWebLicensesCount { get; set; }
        public string CreatedBy { get; set; }
        public string UpdatedBy { get; set; }
    }

public class WebApplication
{
    public int appID { get; set; }
    public string WebApplicationName { get; set; }
    public int Count { get; set; }

    [DisplayFormat(DataFormatString = "{0:dd.MM.yyyy}")]
    public DateTime? EndDate { get; set; }

    public bool Never { get; set; }
    public string CreatedBy { get; set; }
    public string UpdatedBy { get; set; }
}

public class griddetail
{
    public griddetail(List<WebLicenses> wl1, List<WebApplication> wa1)
    {
        weblicences = wl1;
        webapplication = wa1;
    }

    public List<WebLicenses> weblicences { get; set; }
    public List<WebApplication> webapplication { get; set; }        
}

Step2: change in controller as 步骤2:将控制器更改为

  1. Change return type IEnumerable to griddetail class 将返回类型IEnumerable更改为griddetail
  2. At the end declare and assign this nested class in a griddetail class 最后声明并在griddetail类中分配此嵌套类

     public class SlimHomePageData { private SLIMDataContext dc = new SLIMDataContext(ConfigurationManager.ConnectionStrings["SLIMConnectionString"].ConnectionString); . . . public IEnumerable GetOutlookGridDetail(string customerId = "") { List<WebLicenses> weblicenses = new List<WebLicenses>(); List<WebApplication> webapplication = new List<WebApplication>(); //remove from here and add at the end of this method //griddetail returnValue = new griddetail(weblicenses, webapplication); SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["SLIMConnectionString"].ConnectionString); SqlCommand cmd = new SqlCommand("selectCustomerDetail", cn); cmd.CommandType = CommandType.StoredProcedure; SqlParameter param_CustomerID = new SqlParameter("@CustomerID", SqlDbType.VarChar, 10); param_CustomerID.Value = customerId; cmd.Parameters.Add(param_CustomerID); try { cn.Open(); SqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { WebLicenses newRecord = new WebLicenses(); newRecord.WebLicenseName = Convert.ToString(reader["WebLicenseName"]); newRecord.CustomerWebLicensesCount = Convert.ToInt32(reader["CustomerWebLicensesCount"]); weblicenses.Add(newRecord); } } reader.NextResult(); if (reader.HasRows) { while (reader.Read()) { WebApplication newRecord = new WebApplication(); newRecord.WebApplicationName = Convert.ToString(reader["WebApplicationName"]); newRecord.Count = Convert.ToInt32(reader["Count"]); bool never = false; if (reader["Never"] != DBNull.Value) { bool.TryParse(reader["Never"].ToString(), out never); } if (reader["EndDate"] != DBNull.Value) { newRecord.EndDate = Convert.ToDateTime(reader["EndDate"]); } newRecord.Never = never; webapplication.Add(newRecord); } } reader.Close(); } catch (Exception) { // returnValue = null; } finally { cmd.Dispose(); if (cn.State == ConnectionState.Open) { cn.Close(); } } griddetail returnValue = new griddetail(weblicenses, webapplication, webcustomapplication, maintenance, smartcv, histry, doc); return returnValue; } . . }//closing of my SlimHomePageData class 

**Step 3:**In ActionMethod changed as :After posted this question I changed in the method, but you can use the same method concept in above question. **步骤3:**在ActionMethod中更改为:发布此问题后,我在方法中进行了更改,但是您可以在上述问题中使用相同的方法概念。 Later I need another class to add result1 while return. 稍后我需要另一个类在返回时添加result1

      public ActionResult GridViewPartialView()
{
          return View();
}


[HttpPost]
        public ActionResult childGridViewPartialView(string recordId, string filtervalue, string flag)
        {
            if (flag == "GridRowChanged")
            {
                IEnumerable result1;
                griddetail result3;
                if (recordId != null)
                {
                    result1 = (new SlimHomePageData()).GetRecords(recordId, "");  //another result to be add later at the end of action method
                    result3 = (new SlimHomePageData()).GetOutlookGridDetail(recordId); //this was in my question
                }
                else
                {
                    result1 = new List<SlimHomePageRecord>();   //another result to be add later at the end of action method
                    result3 = (new SlimHomePageData()).GetOutlookGridDetail(recordId); //this was in my question
                }

                List<object> finalResult = new List<object>();
                finalResult.Add(result1);
                finalResult.Add(result3);
                return PartialView("OutlookGridDetail", finalResult);  
            }
            else
            {
                return PartialView("childGridViewPartialView", (new SlimHomePageData()).GetRecords(null, null));
            }
        }

the instance weblicenses is a List type. 实例weblicenses是列表类型。 It looks like it should be a single instance of WebLicenses. 看起来它应该是WebLicenses的单个实例。

You may want to add the newRecord instance to the returnValue.wl list instead of the list instance. 您可能想要将newRecord实例添加到returnValue.wl列表中,而不是列表实例中。

Edit: You don't need to add anything to the wl list properties because you are adding to the WebLicenses list. 编辑:您不需要将任何内容添加到wl列表属性,因为您要添加到WebLicenses列表。 The property wl on returnValue is a reference to the WebLicences instance so if you add to WebLicences then wl will show the same addition. returnValue上的属性wl是对WebLicences实例的引用,因此,如果将其添加到WebLicences,则wl将显示相同的添加内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM