【问题标题】:Passing the data from View form to Database将数据从视图表单传递到数据库
【发布时间】:2020-01-10 01:29:57
【问题描述】:

我正在尝试在 ASP.NET Core 中创建一个存储库网站。我有一个 Web 表单,它应该将数据传递到数据库。

我认为数据库连接有效,因为当我输入“dotnet ef 数据库更新”时,它创建了一个包含我模型中的列的表。在我的控制器中,我在应该发布的操作上有一个 [HttpPost] 标签,并且我还注入了一个模型。

很遗憾,当我提交表单时,我收到一个错误:

Microsoft.AspNetCore.Server.Kestrel[13] 连接 id "0HLPJH54HAOGK", 请求 id “0HLPJH54HAOGK:0000000B”:引发了未处理的异常 由应用程序。 System.NullReferenceException:对象引用 未设置为对象的实例。

也没有数据传递到数据库。

控制器:

namespace ASP.Controllers
{
    public class ResolutionController : Controller
    {
        private readonly ResolutionContext _context;

        public ResolutionController(ResolutionContext context)
       {
            _context = context;
        }

        public IActionResult ShowAll()
        {
            return View(_context.Resolutions.ToList());
        } 

        [HttpGet]
        public IActionResult AddResolution()
        { 
            return View();
        }

        [HttpPost]
        public IActionResult AddResolution(Resolution resolution)
        {
            if (ModelState.IsValid)
            {
                _context.Resolutions.Add(resolution);

                _context.SaveChanges();

                return View("AddResolution");
            }
            return View("ShowAll");
        }
    }
}

型号:

namespace ASP.Models
{
    public class ResolutionContext : DbContext
    {
        public ResolutionContext(DbContextOptions<ResolutionContext> options) 
: base(options)
        {
        }
        public DbSet<Resolution> Resolutions { get; set; }
    }

    public class Resolution
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string ResolutionFilePath { get; set; }
        public DateTime DateOfAdopting { get; set; }
    }
}

添加分辨率视图

@model Resolution

@{
    ViewData["Title"] = "Dodaj uchwałę";
}

<div class="section both-sections" >
    <div class="left-side-section">
        dummy
    </div>
    <div id="right-side-section">
        @using (Html.BeginForm())
        {
            <form asp-controller="Resolution" asp-action="AddResolution" 
method="post">
                <h2>Insert Resolution</h2>
                <ul class="add-resolution-list">
                    <li>
                        <label for="name"></label>
                        <input asp-for="Name" class="input-fields">
                    </li>
                    <li>
                        <label for="description"></label>
                        <input type="text" asp-for="Description" class="input-fields">
                    </li>
                    <li>
                        <label for="date"></label>
                        <input type="date" asp-for="DateOfAdopting" class="input-fields">
                    </li>
                    <li>
                        <label for="resolution"></label>
                        <input type="file" name="resolution" class="input-fields">
                    </li>
                    <li>
                        <input type="submit" name="submit-button" value="Add Resolution">
                    </li>
                 </ul>
            </form>
         }
     </div>
</div>

还有 ShowAll 操作:

@model IEnumerable<Resolution>

<p>ViewResolution</p> 

@foreach (var item in Model)
{
<div>
     @Html.DisplayFor(modelItem => item.Name)
</div>
}

我希望它可以将数据从表单写入数据库,但结果却出错了。

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework data-binding


    【解决方案1】:

    ResolutionContext 在构造函数中使用ResolutionController

    您应该在Startup.cs 中注册您的上下文 喜欢

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
        services.AddScoped<ResolutionContext>(_ => new ResolutionContext (Configuration.GetConnectionString("DefaultConnection")));
    }
    

    欲了解更多信息check

    【讨论】:

      【解决方案2】:

      实例化模型并将其传递到您的视图中:

      [HttpGet]
      public IActionResult AddResolution()
      {
          var myModel = new Resolution();
          myModel.DateOfAdopting = DateTime.Now()  // default value
          return View(myModel);
      }
      

      编辑:您在使用asp-for&lt;input&gt; 定义中也有一些拼写错误 - 那是标签。你需要一个name= 属性来绑定&lt;input&gt;s:

      <li>
          <label for="name"></label>
          //  typo 1
          <input type="text" name="Name" class="input-fields">
      </li>
      <li>
          <label for="description"></label>
          //  typo 2
          <input type="text" name="Description" class="input-fields">
      </li>
      <li>
          <label for="date"></label>
          //  typo 3
          <input type="date" name="DateOfAdopting" class="input-fields">
      </li>
      <li>
          <label for="resolution"></label>
          <input type="file" name="resolution" class="input-fields">
      </li>
      <li>
          <input type="submit" name="submit-button" value="Add Resolution">
      </li>
      

      【讨论】:

      • 暂时不要工作。我发现我们正在对数据库执行查询,并且数据库本身对于我提交的每个表单都有一行,但每一列都包含 null 的值。看起来模型绑定不绑定表单中的数据。 [HttpPost] 方法可能有问题。
      • 在HttpPost的第一行设置断点。模型是否填充?如果没有,是否有控制台错误?绑定似乎正确。
      • 是的,在使用调试模式的局部变量中,我有一个分辨率变量,但它的所有子变量仍然为空或随机日期(01.01.0001 00:00:00)