mvc5中html助手下拉列表中控制器上的null值发布

本文关键字:null 控制器 html 下拉列表 mvc5 | 更新日期: 2023-09-27 17:59:37

我使用mvc 5进行学习。当我从下拉列表中发送控制器上的数据时,对象在控制器中具有空值。

型号代码:

    namespace Dropdownlist.Models
    {
       using System;
       using System.Collections.Generic;
       public partial class Country
       {
           public int ID { get; set; }
           public string CountryName { get; set; }
       }
    }

控制器代码:

    namespace Dropdownlist.Controllers
    {
        public class HOMEController : Controller
        {
            DropDownEntities db = new DropDownEntities();
            public ActionResult Index()
            {
                return View();
            }
            [HttpPost]
            public ActionResult Index(Country cn)
            {
                db.Countries.Add(cn);
                db.SaveChanges();
                return View(cn);
            }
       }
   }

查看代码:

   @{
       ViewBag.Title = "Index";
   }
   <h2>Index</h2>
   @using (Html.BeginForm(FormMethod.Post))
   {
       <div>
           @Html.DropDownList("ddlcountry", new List<SelectListItem>
           {
               new SelectListItem{ Text = "India", Value = "India"},
               new SelectListItem{ Text = "UK", Value = "UK"},
               new SelectListItem{ Text = "USA", Value = "USA"}
           }, "Select a Country")
       </div>
       <div>
           <input type="submit" value="Save" />
       </div>
   }

我做错了什么?

mvc5中html助手下拉列表中控制器上的null值发布

如果您希望IDCountryName的值都被发布回来,那么您需要使控件名称与模型的属性相匹配,并且您的视图应该是强类型的,这样您就可以使用Html.DropDownListFor()助手,现在您可以这样做:

 @model Dropdownlist.Models.Country
 @{
       ViewBag.Title = "Index";
   }
   <h2>Index</h2>
   @using (Html.BeginForm(FormMethod.Post))
   {
       <div>
           @Html.DropDownList("ID", new List<SelectListItem>
       {
           new SelectListItem{ Text = "India", Value = 1},
           new SelectListItem{ Text = "UK", Value = 2},
           new SelectListItem{ Text = "USA", Value = 2}
       }, "Select a Country",new { id="ddlCountry"})
       @Html.Hidden("CountryName")
       </div>
       <div>
           <input type="submit" value="Save" />
       </div>
   }

和countryName,您需要将其设置在隐藏字段中,并在下拉索引更改时设置其值,如:

@section Scripts
{
 <script type="text/javascript">
     $(document).ready(function () {
         $("#ddlCountry").on("change", function () {
             $("#CountryName").val($(this).val());
         });
     });
    </script>   
}

如果您想设置CountryName属性,请将视图更改为:

....
    @Html.DropDownListFor(x=>x.CountryName, new List<SelectListItem>
....

从控制器加载下拉数据

ViewBag.DropDown = db.YourModel.ToList();

然后在你看来

@Html.DropDownList("Name", (IEnumerable<SelectListItem>)ViewBag.DropDown, "Select ...")

这里有几个问题。下拉列表的名称为"ddlconational",但操作所需的Country对象不具有ddlcocountry属性。ddlconational是印度/英国/美国的字符串。表单应该返回一个Id,该Id将交叉引用另一个表。目前的形式没有任何意义,因为只有一条数据。

这里有几个问题,但我认为你的问题是:

选择列表项的枚举:

    public enum Countries
    {
        India = 1,
        UK = 2,
        USA = 3
    }

那么对于控制器动作:

    public ActionResult Index()
    {
        ViewBag.Country = Enum.GetValues(typeof(Countries)).Cast<Countries>().ToList().Select(r => new SelectListItem { Text = r.ToString(), Value = ((int)r).ToString() });
        return View();
    }
    [HttpPost]
    public ActionResult Index(Countries country)
    {
        var saveit = country;
        // whatever you wish to do with the result;
        return Content(saveit.ToString());
    }

视图:

@using(Html.BeginForm("Index", "Home", FormMethod.Post))
{
    @Html.DropDownList("Country")
    <button type="submit" >Save</button>
}