【问题标题】:Creating a form and binding to a class without a datatabase创建表单并绑定到没有数据库的类
【发布时间】:2019-12-31 06:08:23
【问题描述】:

我是学习 MVC 的新手,并且确实需要一些帮助——因为我正试图从 ASP.NET Web 窗体继续前进。我的所有数据库事务都有一个自定义 Web API,它非常高效和可靠。我已经在 .NET Core 中对其进行了重新编码。

我的问题是我发现大多数与 MVC 相关的模型绑定示例都是由实体框架示例组成的。我正在寻求帮助,展示如何使用 get() post(form) 操作将 ViewModel 链接到 Controller。我需要看看如何绑定到单选按钮列表等...

我正在使用以下课程,该课程已删除数据库连接以简化答案/建议。

public class BuildSearch
{
    //Bootstrap date entry
    public DateTime StartDate { get; set; }
    //Bootstrap date entry
    public DateTime EndDate { get; set; }
    //Need this bound to a radio button list
    public List<GeoArea> GeoAreas { get; set; }

    public BuildSearch()
        {
            GeoAreas = new List<GeoArea>();
           // StartDate = DateTime.Parse(DateTime.Now.AddDays(-31).ToShortDateString());
           //  EndDate = DateTime.Parse(DateTime.Now.ToShortDateString());

            GeoAreas.Add(new GeoArea { GeoAreaItem = "Region", Id = 0 });
            GeoAreas.Add(new GeoArea { GeoAreaItem = "Manager1", Id = 1 });
            GeoAreas.Add(new GeoArea { GeoAreaItem = "Manager2", Id = 2 });
     } 
 }

public class GeoArea
{
     public int Id { get; set; }
     public string GeoAreaItem { get; set; }
}

我正在尝试创建一个视图,该视图将显示此数据,然后允许我回发用户编辑。我有意保持示例简单,因为一旦我弄清楚如何回发,我可以使用更新的数据处理传递给 Web API 以完成我需要完成的工作。只是想弄清楚我如何绑定到这种类型的类而感到沮丧。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-core-2.2


    【解决方案1】:

    对于单选按钮,我会在 BuildSearch 类中添加一个名为 GeoAreaId 的属性。单选按钮选择将在回发时模型绑定到此属性。因此,您的 BuildSearch 类变为

    public class BuildSearch
    {
        //Bootstrap date entry
        public DateTime StartDate { get; set; }
        //Bootstrap date entry
        public DateTime EndDate { get; set; }
    
        public int GeoAreaId { get; set; } //added field
    
    
        //Need this bound to a radio button list
        public List<GeoArea> GeoAreas { get; set; }
        public BuildSearch()
        {
            GeoAreas = new List<GeoArea>();
            //   StartDate = DateTime.Parse(DateTime.Now.AddDays(-31).ToShortDateString());
            //  EndDate = DateTime.Parse(DateTime.Now.ToShortDateString());
    
            GeoAreas.Add(new GeoArea { GeoAreaItem = "Region", Id = 0 });
            GeoAreas.Add(new GeoArea { GeoAreaItem = "Manager1", Id = 1 });
            GeoAreas.Add(new GeoArea { GeoAreaItem = "Manager2", Id = 2 });
        }
        public class GeoArea
        {
            public int Id { get; set; }
            public string GeoAreaItem { get; set; }
        }
    }
    

    您的控制器中的 get 方法将如下所示

        public IActionResult Search()
        {
            var buildSearch = new BuildSearch();
            return View(buildSearch);
        }
    

    您的视图需要看起来像这样

    @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
    @model  BuildSearch
    
    <form asp-controller="Home" asp-action="Search" method="post">   
    
        <label asp-for="StartDate">Start date</label>
        <input asp-for="StartDate" />
        <label asp-for="EndDate">End date</label>
        <input asp-for="EndDate" />
    
        <fieldset>
            <legend>
                GeoArea
            </legend>
            @foreach (var item in Model.GeoAreas)
            {
                <input type="radio" name="GeoAreaId" value="@item.Id" />
                @item.GeoAreaItem
            }
        </fieldset>
    
        <input type="submit" />
    </form>
    

    对于单选按钮,请注意名称属性如何与我添加到您的 BuildSearch 类的新属性 GeoAreaId 匹配。这对于模型绑定的工作很重要。

    那么你的控制器中的 post 方法需要如下所示

        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Search(BuildSearch buildSearch)
        {
            //...
        }
    

    要查看发生了什么,请在此方法中设置一个断点。运行代码,在表单中输入一些值,然后单击提交。当代码在 buildSearch 上停止时,您将看到模型绑定已经工作。属性 StartDate、EndDate 和 GeoAreaId 将包含您需要的表单值。

    【讨论】:

      【解决方案2】:

      这是一个单选按钮示例: https://www.c-sharpcorner.com/article/radiobutton-in-asp-net-mvc/

      这是将表单数据从 html 表单获取到控制器的一个很好的示例。

      https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/controller-methods-views?view=aspnetcore-2.2

      将数据放入视图模型中,您将执行类似的操作

      public async Task<IActionResult> Index()
      {    
          var movies = await _context.Movies.ToList();
          if (movies == null)
          {
              return NotFound();
          }
          return View(movies);
      }
      

      然后,您将需要该表单来对您的操作进行发布操作,例如

      [HttpPost]
      [ValidateAntiForgeryToken]
      public async Task<IActionResult> Edit(int id, [Bind("ID,Title,ReleaseDate,Genre,Price")] Movie movie)
      {    
          if (ModelState.IsValid)
          {
                  //post to api here
      
              return RedirectToAction(nameof(Index));
          }
          return View(movie);
      }
      

      您必须将模型或视图模型传递给 html 类

      @model MvcMovie.Models.Movie
      
      @{
          ViewData["Title"] = "Edit";
      }
      
      <h1>Edit</h1>
      
      <h4>Movie</h4> etc etc
      

      【讨论】:

      • 感谢您的帖子。澄清几点。在这种情况下,单选按钮列表是从 List 派生的,并且可以动态更改。即不会知道男性/女性二元期权。因此,事后对列表的选项进行硬编码是行不通的。另外,您指向我的示例也使用了数据库,绑定会与此处的类或连接相关联吗?
      • 说实话我会用ajax来检索细节。您将有一个项目,例如位置,然后有一个 onchange 来重新创建单选按钮。 stackoverflow.com/questions/23126196/…
      猜你喜欢
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多