【问题标题】:How to save ListBoxFor Values to database in MVC5如何在 MVC5 中将 ListBoxFor 值保存到数据库
【发布时间】:2014-07-01 13:08:40
【问题描述】:

我想将所有 listBoxFor 值保存到数据库中...发布表单时出现此错误,提示 Object not Set to an Instant of an Object,谁能帮我找出问题所在?

这就是全部代码

这是包含所有值的列表框代码:

@Html.ListBoxFor(model => model.SelectedRecipientId, new MultiSelectList(Model.Recipients, "ID", "RecipientNumbers"), new { id = "recipientList", style = "width: 250px; height: 160px;", name = "recipientList" })

这是我的视图模型

public class SendViewModel
{
    public SendViewModel()
    {
        ScheduledDate = DateTime.Now;
    }

    public int Id { get; set; }
    public string Message { get; set; }
    public DateTime ScheduledDate { get; set; }

    public IEnumerable<SelectListItem> Times { get; set; }
    public string[] SelectedRecipientId { get; set; }

    [Required]
    public IEnumerable<SelectListItem> Recipients { get; set; }
}

这是我要写入的模型

public class SentMessage
{
    public int Id { get; set; }
    public string Message { get; set; }
    public string SenderId { get; set; }
    public DateTime SendDate { get; set; }
    public int RecipientCount { get; set; }
    ...

    public virtual ICollection<MessageRecipient> Recipients { get; set; }
}

这是我的后期控制器

if (ModelState.IsValid)
{
    if (model.ScheduledDate == DateTime.Now)
    {
        _messageService.SendMessage(User, SenderId, model.Message, model.SelectedRecipientId);

        return Redirect("/UserAccount/SendMessageConfirmation");
    }
}

最后这是消息服务参数集合

int SendMessage(int userId, string senderId, string message, IEnumerable<string> recipients);

这是将视图中的所有数据保存到数据库的签名,IEnumerable&lt;string&gt; recipients 是用于从列表框中获取所有值的参数。

我该如何做才能将其保存到数据库中。

这是错误堆栈跟踪

Server Error in '/' Application.

对象引用未设置为对象的实例。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:对象引用未设置为对象的实例。

来源错误:

第 68 行: 第 69 行:收件人 第 70 行:@Html.ListBoxFor(model => model.SelectedRecipientId, new MultiSelectList(Model.Recipients, "ID", "RecipientNumbers"), new { id = "recipientList", style = "width: 250px; height: 160px; ", name = "SelectedRecipientId" }) 第 71 行: 第 72 行:

源文件:c:\Development\Projects\SMSXChange\SmsXchange\XChange.MVC\Views\Message\Send.cshtml 行:70

堆栈跟踪:

[NullReferenceException:对象引用未设置为对象的实例。] ASP._Page_Views_Message_Send_cshtml

【问题讨论】:

  • 您将 Select 控件的名称设置为 recipientList,然后您尝试访问 model.SelectedRecipientId .. 它将如何工作?元素名称应与模型类的属性名称匹配
  • 请问是这个原因吗?
  • 是的,您可以更改它并检查输出
  • 我更改了名称,但仍然出现此错误“对象引用未设置为对象的实例。”
  • 你能解释一下你在哪一行得到错误吗?请将异常堆栈跟踪添加到帖子中以查看它

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


【解决方案1】:

感谢您提供错误详细信息,

虽然我在评论中提到的事情是正确的,“HTML Element Name”和“Model Property Name”都应该类似于发布值,但这里的问题与您遇到的错误不同。

确保在呈现视图之前正确填充 Model.Recipients 属性。您从调用视图的位置执行的操作应为 Model.Recipients 属性分配正确的值。您的属性为 null,因此会引发对象引用错误。

事实上,错误应该出现在表单的初始加载而不是发布后。 如果在发布表格后仍然出现,那么有以下可能性。 正如您添加了 ModelState.IsValid 检查,这似乎没有得到满足,并且存在一些验证错误,导致 Post 操作方法再次呈现相同的视图(您在其他部分没有做任何其他事情的提供者)以及当视图再次加载它没有填充选择列表,因为您没有在 post 方法中添加该代码。因此,如果出现任何验证错误,可能的解决方案是在 POST 操作中再次填写 Model.Recipients。希望你明白我的意思

【讨论】:

  • 是的,这是真的,事实上,我遇到了问题,所以请我如何将它实例化到我的收件人模型中,以便当我将收件人添加到列表框时,它将获取列表框值并在发布时到数据库...这是我的收件人模型 ::::::::: public class MessageRecipient { public int Id { get;放; } 公共 int MessageId { 获取;放; } 公共 SentMessage 消息 { 获取;放; } 公共字符串 MobileNumber { 获取;放; } 公共 MessageStatus 状态 { 获取;放; } }
  • 令人困惑的是,我没有将任何数据从数据库拉到列表框。我只是将内容添加到视图中的列表框,然后将其发送到数据库......为什么我需要在 GetAction 中实例化??
  • 嗯,您编写 @Html.ListBoxFor 并提供选择列表对象的方式,您必须实例化它
  • 好的,请问我这样做吗?...在​​调试时我发现列表框在帖子中返回null,我该如何分配它请帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2017-12-01
相关资源
最近更新 更多