2016-01-08 31 views
0

我想用外鍵將我的數據打包成表格,並將其發送到數據庫。我通過控制器從數據庫收集數據並在我的視圖中顯示,當我完成形式不能發送到數據庫,看到了異常無法將我的下拉列表中的數據插入到mvc4中的外鍵數據庫中

我的控制器代碼

public ActionResult Register() 
    { 
     testContext test = new testContext(); 
     List<SelectListItem> listselecteditem = new List<SelectListItem>(); 
     foreach (Gender item in test.genders) 
     { 
      SelectListItem selectlist = new SelectListItem() 
      { 
       Text = item.GenderType, 
       Value = item.GenderID.ToString(), 
      }; 
      listselecteditem.Add(selectlist); 
     } 
     ViewBag.Datalist = new SelectList(listselecteditem, "Value", "Text"); 
     return View(); 
    } 

該控制器從數據庫中獲取數據,併發送至DROPDOWNLIST

和該控制器保存在數據庫中我的數據

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(Person p) 
    { 

     using (testContext test=new testContext()) 
     { 

      if (ModelState.IsValid) 
      { 
       try 
       { 
        test.persons.Add(p); 
        test.SaveChanges(); 
        ViewBag.Message="Success"; 
       } 
       catch (Exception ec) 
       { 

        ViewBag.Message = ec.Message; 
       } 

      } 
     } 
     return View(p); 
    } 

這是我的看法

@model testmvc.Models.Person 

<div class="container"> 
    <div class="row"> 
     <div class="pull-right col-sm-offset-3 col-sm-6"> 
      <div class="panel panel-default"> 
       <div class="panel-heading "> 
        <p>register</p> 
       </div> 
       <div class="panel-body"> 
        @using (Html.BeginForm("Register", "RegisterLogin", FormMethod.Post, new { @class = "form-horizontal" })) 
        { 

         @Html.ValidationSummary(true) 
         <fieldset> 
          @Html.AntiForgeryToken() 
          @if (ViewBag.Messsage != null) 
          { 
           <div class="alert alert-success"> 
            <p>@ViewBag.Message</p> 
           </div> 
          } 
          <div class="form-group"> 
           @Html.TextBoxFor(model => model.Fullname, new { @class = "form-control", @placeholder = "Full name" }) 
          </div> 
          <div class="form-group"> 
           @Html.TextBoxFor(model => model.Username, new { @class = "form-control input-sm", @id = "last_name", @placeholder = "Username" }) 
          </div> 
          <div class="form-group"> 
           @Html.TextBoxFor(model => model.EmailAddress, new { @class = "form-control input-sm", @id = "email", @placeholder = "Email address" }) 
          </div> 
          <div class="form-group"> 
           @Html.TextBoxFor(model => model.Password, new { @class = "form-control input-sm floatlabel", @id = "first_name", @placeholder = "Password" }) 
          </div> 
          <div class="form-group"> 
           @Html.TextBoxFor(model => model.Comfirmpassword, new { @class = "form-control input-sm", @id = "last_name", @placeholder = "confirmpassword" }) 
          </div> 
          <div class="form-group"> 
           @*<select> 
             @foreach (var item in ViewBag.DataList) 
             { 
              <option>@item.Text</option> 
             } 
           </select>*@ 
           @Html.DropDownList("Datalist",String.Empty) 
          </div> 
          <div class="form-group"> 
           @Html.TextBoxFor(model => model.Birthday, new { @class = "form-control input-sm", @id = "password_confirmation", @placeholder = "Birthday yyyy/dd/mm" }) 
          </div> 
          <div> 
           <input type="submit" value="Register" class="btn btn-primary"> 
          </div> 
         </fieldset> 
        } 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

和我的模型代碼

public partial class Person 
{ 
    [Key] 
    public int personID { get; set; } 
    [Required] 
    public String Fullname { get; set; } 
    [Required] 
    public String Username { get; set; } 
    [Required] 
    public String Password { get; set; } 
    [Required] 
    [NotMapped] 
    public String Comfirmpassword { get; set; } 
    [Required] 
    public String EmailAddress { get; set; } 
    [DataType(DataType.DateTime)] 
    [Required] 
    public DateTime Birthday { get; set; } 
    public int GenderID { get; set; } 
    [ForeignKey("GenderID")] 
    public virtual Gender Gender { get; set; } 
} 

[Table("Gender")] 
public partial class Gender 
{ 
    [Key] 
    public int GenderID { get; set; } 
    [Required] 
    public String GenderType { get; set; } 
    public virtual ICollection<Person> Persons { get; set; } 
} 

此異常說,沒有與 「Datalist中」 任何可視數據的關鍵。我怎樣才能解決這個問題,我的代碼問題是什麼

回答

1

你得到這個異常的原因是因爲在[HttpPost]動作中,你沒有填充ViewBag.Datalist屬性,這是你在Get操作中的做法。由於您重新顯示相同的視圖,並且此視圖需要此信息才能正確顯示下拉列表,因此您需要填充它。爲了避免重複,你可以把這個邏輯在一個單獨的方法:

private SelectList GetGenders() 
{ 
    using (testContext test = new testContext()) 
    { 
     List<SelectListItem> listselecteditem = new List<SelectListItem>(); 
     foreach (Gender item in test.genders) 
     { 
      SelectListItem selectlist = new SelectListItem() 
      { 
       Text = item.GenderType, 
       Value = item.GenderID.ToString(), 
      }; 
      listselecteditem.Add(selectlist); 
     } 
     return new SelectList(listselecteditem, "Value", "Text"); 
    } 
} 

,你要在你的2個行動呼籲:

public ActionResult Register() 
{ 
    ViewBag.Datalist = GetGenders(); 
    return View(); 
} 

和:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Register(Person p) 
{ 
    using (testContext test = new testContext()) 
    { 
     if (ModelState.IsValid) 
     { 
      try 
      { 
       test.persons.Add(p); 
       test.SaveChanges(); 
       ViewBag.Message = "Success"; 
      } 
      catch (Exception ec) 
      { 
       ViewBag.Message = ec.Message; 
      } 
     } 
    } 

    ViewBag.Datalist = GetGenders(); 
    return View(p); 
} 
+0

感謝alot.I請小心,並找出我可以使用linq代碼,並刪除它的所有選擇,插入,刪除和update.is這是正確的嗎?我是如此新的asp.net MVC,你能說我用什麼書來學習如何與linq一起工作? –

相關問題