【问题标题】:Cannot perform runtime binding on a null reference with ViewBag and List无法使用 ViewBag 和 List 对空引用执行运行时绑定
【发布时间】:2019-01-11 01:00:47
【问题描述】:

我似乎找不到解决方法,我认为我只是采取了错误的方法,但正确的方法是什么?

我的控制器有这样的方法:

        public List<System.Web.Mvc.SelectListItem> GetSupplierAvg(string cityname, string actualproduct)
    {
        var gsa = db.Database.SqlQuery<string>("select distinct SupplierAvg from OPIS_Price_import where City=@cn and ActualProduct=@ap", 
            new SqlParameter("@cn", cityname), new SqlParameter("@ap", actualproduct));
        var SupplierAvgList = new List<SelectListItem>();
        foreach (var thing in gsa)
        {
            SupplierAvgList.Add(new SelectListItem { Text = thing, Selected = false, Value = thing });
        }

        ViewBag.SupplierAvgList = SupplierAvgList;
        return ViewBag.SupplierAvgList;
    }

我的视图正试图这样称呼它:

@Html.DropDownList("SupplierAvgList", (IEnumerable<SelectListItem>)ViewBag.SupplierAvgList(item.CityName,thing))

但也许这不是应该的工作方式。任何见解都将不胜感激。

【问题讨论】:

  • (IEnumerable&lt;SelectListItem&gt;)ViewBag.SupplierAvgList(item.CityName,thing) 看起来很奇怪。 ViewBag.SupplierAvgList 是一种方法吗?尝试检查 ViewBag.SupplierAvgList 在页面呈现时是否不为空,也在获取/发布请求时
  • @Html.DropDownList("SupplierAvgList", new SelectList(ViewBag.SupplierAvgList, "Value" , "Text"))
  • @NaDeRStar 引发“值不能为空”错误。如果它正在调用肯定返回数据的方法,我看不出它怎么会为 null。

标签: c# model-view-controller view viewbag


【解决方案1】:

我认为由于列表调用错误而无法正常工作。您正在尝试像方法一样调用SupplierAvgList,但这是一个字段(也应该检查它是否为空)。还猜测您正在尝试使用一些参数调用GetSupplierAvg 方法。如果是这样,那么您必须使用 API 调用它或像另一个页面一样调用它(与操作 GetSupplierAvg 绑定),例如:

@Html.ActionLink("link text", "GetSupplierAvg", "controllerName", new { cityname = item.CityName, actualproduct = thing  }, null)

更新

你可以试试下面的方法。 从您的视图调用方法并将此值传递给您的下拉列表:

@{
    var dropDownData = ((YourController)this.ViewContext.Controller).GetSupplierAvg(item.CityName, thing);
}
@Html.DropDownList("SupplierAvgList", dropDownData);

附: ASP.Net MVC: Calling a method from a view

【讨论】:

  • 如果我需要使用链接来填充页面但我需要页面在运行时填充下拉列表,这将起作用。
【解决方案2】:

您必须将返回类型从列表更改为操作结果,并且应该返回一个视图。

 public ActionResult GetSupplierAvg(string cityname, string 
 actualproduct)
 {
    var gsa = db.Database.SqlQuery<string>("select distinct SupplierAvg from 
               OPIS_Price_import where City=@cn and ActualProduct=@ap", 
    new SqlParameter("@cn", cityname), new SqlParameter("@ap", actualproduct));
    var SupplierAvgList = new List<SelectListItem>();
    foreach (var thing in gsa)
    {
        SupplierAvgList.Add(new SelectListItem { Text = thing, Selected = false, 
        Value = thing });
    }

    ViewBag.SupplierAvgList = SupplierAvgList;
    return View;
 }

那么在 HTML 中,应该写成这样,

@{
var list = "Select Option";
if(@ViewBag.SupplierAvgList!=null)
{
  list = @ViewBag.SupplierAvgList;
}
}

// Your DropDown code here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多