【问题标题】:Retrieve and populate data ASP.Net Core 2.2 MVC检索和填充数据 ASP.Net Core 2.2 MVC
【发布时间】:2021-02-13 17:40:21
【问题描述】:

我的控制器中有以下代码,我将在其中返回一个帐户视图,并将参数传递给它,如下所示

[HttpGet]
    public async Task<ActionResult> Account()
    {

        var findUser = await UserMgr.FindByNameAsync(User.Identity.Name);

        var contactDetails =
          (from c in _context.UserPersonalDetails
           where c.ID == findUser.Id
           select c);

        var result = _context.Database.ExecuteSqlCommand("select * from [dbo].[UserPersonalDetails] where ID={0}", findUser.Id);

        ViewBag.Data = contactDetails;

        return View(contactDetails);
    }

这是我的模特

public class UserPersonalDetails
{
    [Key]
    public int ID { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 3)]
    [DataType(DataType.Text)]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 3)]
    [DataType(DataType.Text)]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    [Required]
    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Phone")]
    public string Phone { get; set; }}

这是我声明模型的视图,并且

@model FriendShipping.Models.UserPersonalDetails

                                <form method="post" asp-action="account" asp-controller="account" id="registrationForm">
                                <div asp-validation-summary="All" class="text-danger"></div>
                                <div class="form-group">
                                    <div class="col-xs-6">
                                        <label asp-for="FirstName"></label>
                                        <input asp-for="FirstName" type="text" class="form-control" />
                                        <span asp-validation-for="FirstName" class="text-danger"></span>
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-xs-6">
                                        <label asp-for="LastName"></label>
                                        <input asp-for="LastName" type="text" class="form-control" />
                                        <span asp-validation-for="LastName" class="text-danger"></span>
                                    </div>
                                </div>
                                <div class="form-group">
                                    <div class="col-xs-6">
                                        <label asp-for="Phone"></label>
                                        <input asp-for="Phone" type="text" class="form-control" />
                                        <span asp-validation-for="Phone" class="text-danger"></span>
                                    </div>
                                </div>   
                                <div class="form-group">
                                    <div class="col-xs-12">
                                        <br>

                                        <button type="submit" class="btn btn-success small" id="saveUpdatedDetails" disabled><i class="glyphicon glyphicon-ok-sign"></i> Save</button>
                                        <button type="button" class="btn" id="enableUpdate"><i class="glyphicon glyphicon-repeat"></i> Update</button>
                                    </div>
                                </div>
                            </form>

返回视图时,我收到以下错误,我尝试通过多种方式重构代码,但它仍然存在

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[FriendShipping.Models.UserPersonalDetails]', but this ViewDataDictionary instance requires a model item of type 'FriendShipping.Models.UserPersonalDetails'.

我的主要问题是如何使用检索到的数据填充到输入字段中? 感谢任何指导/帮助。

【问题讨论】:

    标签: c# asp.net-core model-view-controller entity-framework-core data-retrieval


    【解决方案1】:

    SqlNullValueException:数据为空。不能对 Null 值调用此方法或属性。

    似乎表格列具有NULL 值,而您的所有属性都设置有[Required] 属性,因此会引发此错误。您可以查看UserPersonalDetails表中ID等于findUser.Id的记录,看看它的列中是否有空值。

    here 解决了一个类似的问题。你可以参考一下。

    【讨论】:

      【解决方案2】:

      改变

      var contactDetails =
                (from c in _context.UserPersonalDetails
                 where c.ID == findUser.Id
                 select c);
      

      到

      if( findUser ==null) return NotFound("user is not found");
      
      var contactDetails =
                (from c in _context.UserPersonalDetails
                 where c.ID == findUser.Id
                 select c).FirstOrDefault();
      or even shorter:
      var contactDetails = await _context.DbSet<UserPersonalDetails>()
                 .Where(c=> c.ID == findUser.Id)
                 .FirstOrDefaultAsync();
      And add  attribut  [Table("UserPersonalDetails")] to the top of the class.
      
      Just remember for the future: NEVER GIVE PLURAL NAMES ENDING AT S TO ENTITY. It is very confusing since EF usually almost automaticly assingns plural names to the collections.
      

      【讨论】:

      • 嗨 Serge,这主要是为了看看我是否能够将任何东西传递给 View 类尝试了你的答案但我收到一个错误:SqlNullValueException:数据为 Null。不能对 Null 值调用此方法或属性。
      • 如果返回一个值...它不喜欢添加到 Linq 查询末尾的 FirstOrDefault()。一旦我删除它,它就会返回结果,然后在返回视图时再次失败,并出现以下错误:InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为“Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[FriendShipping.Models. UserPersonalDetails]',但此 ViewDataDictionary 实例需要“FriendShipping.Models.UserPersonalDetails”类型的模型项。
      • 我只是注意到您正在使用异步。我添加了异步变体。检查我的答案。
      • 试图实现它,这是新的错误 InvalidOperationException:传递到 ViewDataDictionary 的模型项的类型为 'System.Runtime.CompilerServices.AsyncTaskMethodBuilder1+AsyncStateMachineBox1[FriendShipping.Models.UserPersonalDetails,Microsoft .EntityFrameworkCore.Query.Internal.QueryCompiler+d__21`1[FriendShipping.Models.UserPersonalDetails]]',但此 ViewDataDictionary 实例需要“FriendShipping.Models.UserPersonalDetails”类型的模型项。
      • 这意味着运行的任务太多。尝试直接分配 findUserId = ... 并删除 UserMgr.FindByNameAsync。现在也删除 var result = _context.Database.ExecuteSqlCommand("select * from [dbo].[UserPersonalDetails] where ID={0}", findUser.Id); ViewBag.Data = contactDetails;但我不确定这是否足够。
      【解决方案3】:

      查询返回iQueryable&lt;UserPersonalDetails&gt; 你的模特在哪里等着UserPersonalDetails 在控制器中尝试此编辑

      var contactDetails =(from c in _context.UserPersonalDetails where c.ID == findUser.Id select c).FirstOrDefault();

      【讨论】:

      • 我按照您的建议进行了更改,但现在出现此错误:SqlNullValueException:数据为空。不能对 Null 值调用此方法或属性。我的表中有数据
      猜你喜欢
      • 2021-02-24
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2022-09-26
      • 2020-06-27
      • 1970-01-01
      相关资源
      最近更新 更多