【问题标题】:Cannot implicitly convert type 'string[]' to 'string'无法将类型“字符串 []”隐式转换为“字符串”
【发布时间】:2018-01-18 15:35:32
【问题描述】:

我的索引视图中有以下代码

public ActionResult Index(string searchBy, string search)
 {
   Session["FullName"] = search;

   var dbsenderPostal = (from a in db.TblCUSTOMER_PROFILE
                                where a.FullName == search
                                select a.PostalAddress).ToArray();

   Session["PostalAddress"] = dbsenderPostal;

   if (searchBy == "XXX")
        {
            return View(db.TblCUSTOMER_PROFILE.Where(senders => 
            senders.GeneratedCode == search || search == null).ToList());
        }
        else
        {

            return View(db.TblCUSTOMER_PROFILE.Where(senders => 
            senders.CustomerFullName.StartsWith(search) || search == 
            null).ToList());

        }
 }

在我的 [HttpPost] MorePost 视图中,我使用带有值对的 Sessions 将数据传递给这个“MorePost”后控制器。如果我将 .Split() 方法添加到“ViewBag.messages2”,则会出现另一个错误,因为“'System.Array' 不包含拆分的定义”。这是从网上进一步研究来解决这个问题的。请我对 ViewBag 的 LINQ 查询做错什么,它将数据传递给对象名称“sentprint”。我能够以“P.O.Box AX 33 Miami”的形式从 LINQ 查询中检索数据。我也尝试过使用“TempData”。 像这个 TempData["PostalAddress"]。 我确实尝试了其他方法,这些方法会给出其他错误,例如“无法将类型'System.Data.Entity.Infrastructure.DbQuery' 隐式转换为'string'”。抱歉,我是 LINQ 查询的新手。提前致谢。

 [HttpPost]
 public ActionResult MorePost(string Itemn)
  {
    TblSENDERSINFORMATION sentprint = new TblSENDERSINFORMATION();

        ViewBag.messages = Session["FullName"];

        sentprint.NameOfSender = ViewBag.messages;

        ViewBag.messages2 = Session["PostalAddress"];

        sentprint.PostalAddress = ViewBag.messages2;  //Error found here

        sentprint.Item = Itemn;
  }

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc linq


    【解决方案1】:

    你的问题出在 linq 查询本身,让我解释一下原因

    在您的查询中,由于这个原因,您会得到一个字符串数组

    .ToArray()

    即使只有一项,也是包含一项的字符串数组

      var dbsenderPostal = (from a in db.TblCUSTOMER_PROFILE
                                    where a.FullName == search
                                    select a.PostalAddress).ToArray();
    

    所以您的解决方案非常简单,只需将 ToArray() 更改为 FirstOrDefault(),这样您将始终只获得一个字符串项(如前 1但略有不同)

    所以你的查询应该是这样的

      var dbsenderPostal = (from a in db.TblCUSTOMER_PROFILE
                                    where a.FullName == search
                                    select a.PostalAddress).FirstOrDefault();
    

    现在您的会话变量将是一个字符串。

    在这种情况下,您必须更好地了解 linq 和泛型。

    【讨论】:

    • 这个答案是正确的,我只想补充一点,FirstOrDefault() 方法名称令人困惑,因为如果查询没有返回结果,您将得到 null 而不是像空字符串那样的默认值。因此,如果邮政地址在您的代码中某处不能为空,您可能需要处理它。
    • @Dexter 很高兴知道它对您有用,请将答案标记为正确
    【解决方案2】:

    这是一个示例,说明为什么在您知道自己在做什么之前不应使用 var。

    使用强类型,除非您能够阅读代码,否则使用软类型。

    var dbsenderPostal = (from a in db.TblCUSTOMER_PROFILE
                                    where a.FullName == search
                                    select a.PostalAddress).ToArray();
    

    字面意思是:

    string[] dbsenderPostal = (from a in db.TblCUSTOMER_PROFILE
                                    where a.FullName == search
                                    select a.PostalAddress).ToArray();
    

    因此:

    ViewBag.messages2 = Session["PostalAddress"];
    sentprint.PostalAddress = ViewBag.messages2
    

    这毫无意义,您实际上是在尝试将 string[] 放入字符串中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2014-05-15
      • 2014-02-04
      • 2011-05-28
      相关资源
      最近更新 更多