Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “必需”属性在外键下拉列表中不起作用_C#_Asp.net Mvc - Fatal编程技术网

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是默认属性(include
City\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将不胜感激