C# “必需”属性在外键下拉列表中不起作用
我使用数据库优先的方法创建了一个项目,在该方法中,我的表 城市-包含以下列C# “必需”属性在外键下拉列表中不起作用,c#,asp.net-mvc,C#,Asp.net Mvc,我使用数据库优先的方法创建了一个项目,在该方法中,我的表 城市-包含以下列 City_Id City_Name State_Id State_Id是State表的外键 现在所有的验证和一切都在运行,直到我在City.cs模型文件中的State_Id上添加了[Required]注释,就是这样 //------------------------------------------------------------------------------ // <auto-genera
City_Id
City_Name
State_Id
State_Id是State表的外键
现在所有的验证和一切都在运行,直到我在City.cs模型文件中的State_Id上添加了[Required]注释,就是这样
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SS.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
public partial class City
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public City()
{
this.Areas = new HashSet<Area>();
}
public int City_Id { get; set; }
[Required]
[DisplayName("City Name")]
[StringLength(50,ErrorMessage = "City Name exceeds limit of 50 characters")]
[RegularExpression(@"[A-Z][a-z]+",ErrorMessage ="Input Format Incorrect")]
[Remote("CheckDuplicateInState","Cities",AdditionalFields ="State_Id",ErrorMessage ="There cannot be duplicate city names in same state")]
public string City_Name { get; set; }
[DisplayName("State Name")]
public int State_Id { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Area> Areas { get; set; }
public virtual State State { get; set; }
}
}
在City.cs中的State_Id上放置[Required]时,在查看页面源的下拉html中不会生成所需的属性数据val Required
<div class="form-group">
<label class="control-label col-md-2" for="State_Id">State Name</label>
<div class="col-md-10">
<select class="form-control" id="State_Id" name="State_Id"><option value="">Select State</option>
<option value="1">Madhya Pradesh</option>
<option value="2">Gujarat</option>
<option value="4">Punjab</option>
<option value="9">Tamil Nadu</option>
<option value="10">Haryana</option>
</select>
<span class="field-validation-valid text-danger" data-valmsg-for="State_Id" data-valmsg-replace="true"></span>
</div>
</div>
州名
选择状态
中央邦
古吉拉特邦
旁遮普省
泰米尔纳德邦
哈里亚纳
您对@Html.DropDownList(“State\u Id”,null,…)
的使用绑定到State\u Id
,它是您添加到ViewBag
的选择列表
属性(并且没有任何验证属性)
相反,为绑定到的属性和SelectList
指定不同的名称,以便可以强绑定到模型属性
ViewBag.StateList = new SelectList(db.States, "State_Id", "State_Name");
在我看来
@Html.DropDownListFor(m => m.State_Id, (SelectList)ViewBag.StateList, "Select State", new { @class = "form-control" })
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(City city)
{
if (ModelState.IsValid)
{
....
}
ViewBag.StateList = new SelectList(db.States, "State_Id", "State_Name"); // add this
return View(city);
}
现在将为客户端验证添加正确的所需数据值
和数据值编号
属性
然后在POST方法中,您需要在返回视图之前重新填充ViewBag
属性
@Html.DropDownListFor(m => m.State_Id, (SelectList)ViewBag.StateList, "Select State", new { @class = "form-control" })
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(City city)
{
if (ModelState.IsValid)
{
....
}
ViewBag.StateList = new SelectList(db.States, "State_Id", "State_Name"); // add this
return View(city);
}
旁注:没有必要使用[Bind]
属性,因为您的include all properties是默认属性(includeCity\u Id
没有意义,因为您没有也不应该对其进行控制
更好的方法是使用包含
IEnumerable StateList
的视图模型,这样您就可以简单地使用@Html.DropDownListFor(m=>m.State\u Id,model.StateList,…)
只是为了确保……更改保存SelectList状态的ViewBag属性的名称。如果它与绑定的属性名称相同,则会出现一个小错误。因此,您需要在DropDownList帮助器中传递SelectList。名称相同,但这不是错误。正确填充下拉列表,并放入[必需]StateId
上的
将完全没有任何区别。属性是始终必需的int
(添加[必需]
的唯一原因是显示特定的错误消息)如果您检查生成的html,您将看到相关的数据val-*
属性正在呈现。@StephenMuecke Listen buddy它正在改变世界属性State_Id所需的数据val没有显示在我上面发布的页面源代码中的下拉html中。此外,请不要对堆栈溢出问题投票,这会阻止像我这样的开发人员提问。不是这样的。您的代码中还有其他原因g您的问题,但您发布了太多不相关的代码,无法浏览(所有这些控制器方法,如Delete()
与此有什么关系?)我很感激您抽出时间解决了我的问题。谢谢您,如果您至少能取消对我问题的否决票,muchI将不胜感激