2

私は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; }

}

これは、最初のモデル コードを次のように使用する 2 番目のモデル コードです (ここでは、ストアド プロシージャは 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;
}

これは私のコントローラーコードです。

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

2 つのリストで構成される単一のリストを返したい (ただし、上記のエラーが発生します)。また、ストアドプロシージャが複数のテーブルを返し、モデルを介してビューに値を設定したいので、このアプローチは正しいですか。

4

2 に答える 2

5

答えるのを忘れていましたが、昨日誰かがマイナス票を投じました。はい、長すぎます。私がやったこと(もっと理解するためにすべてをもう一度説明します):

Step1: 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:コントローラを次のように変更します

  1. 戻り値の型IEnumerablegriddetailクラスに変更
  2. 最後に、クラスでこのネストされたクラスを宣言して割り当て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
    

**ステップ 3:** In ActionMethod changed as :この質問を投稿した後、メソッドを変更しましたが、上記の質問で同じメソッドの概念を使用できます。後で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));
            }
        }
于 2015-11-23T10:44:10.917 に答える
0

インスタンス weblicenses はリスト タイプです。WebLicenses の単一インスタンスである必要があるようです。

リスト インスタンスの代わりに、newRecord インスタンスを returnValue.wl リストに追加することができます。

編集: WebLicenses リストに追加するため、wl リスト プロパティに何も追加する必要はありません。returnValue のプロパティ wl は WebLicences インスタンスへの参照であるため、WebLicences に追加すると、wl は同じ追加を表示します。

于 2013-02-16T14:41:05.163 に答える