2014-10-24 5 views
1

ASP.NET 모델 뷰 컨트롤러에서 프로젝트에 문제가 있습니다.ASP.NET MVC에서 DB를 편집 할 때 값이 null입니다.

나는 "방명록"응용 프로그램을 가지고 있습니다. 손님을 성공적으로 만들 수 있지만 편집 할 수는 없습니다.

봐 : 1. 내가 시작 응용 프로그램 - 나는 게스트를 만드는 모든 확인
2 - 모든 확인 (고객이 입력 한 모든 데이터가)
3. 나는 "편집"클릭 - 모든 확인
4. 나는 새로운 창문을 본다. 화면의 모든 필드는 정확한 데이터를 가지고 있지만 편집 기능에 중단 점이 있으며 모든 변수가 null 인 것을 볼 수 있습니다.

모델 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Entity; 
using System.ComponentModel.DataAnnotations; 

namespace Guestbook.Models 
{ 
    public class Guest 
    { 
     public int ID { get; set; } 

     [Display(Name = "name", ResourceType=typeof(Resources.Resources))] 
     [Required(ErrorMessageResourceType = typeof(Resources.Resources), 
       ErrorMessageResourceName = "nameRequired")] 
     [StringLength(50, ErrorMessageResourceType = typeof(Resources.Resources), 
          ErrorMessageResourceName = "nameLong")] 
     public string name { get; set; } 

     [Display(Name = "surname", ResourceType = typeof(Resources.Resources))] 
     [Required(ErrorMessageResourceType = typeof(Resources.Resources), 
       ErrorMessageResourceName = "surnameRequired")] 
     [StringLength(50, ErrorMessageResourceType = typeof(Resources.Resources), 
          ErrorMessageResourceName = "surnameLong")] 
     public string surname { get; set; } 

     [Display(Name = "firm", ResourceType = typeof(Resources.Resources))] 
     [Required(ErrorMessageResourceType = typeof(Resources.Resources), 
       ErrorMessageResourceName = "firmRequired")] 
     [StringLength(50, ErrorMessageResourceType = typeof(Resources.Resources), 
          ErrorMessageResourceName = "firmLong")] 
     public string firm { get; set; } 

     [Display(Name = "toWhom", ResourceType = typeof(Resources.Resources))] 
     [Required(ErrorMessageResourceType = typeof(Resources.Resources), 
       ErrorMessageResourceName = "toWhomRequired")] 
     [StringLength(50, ErrorMessageResourceType = typeof(Resources.Resources), 
          ErrorMessageResourceName = "toWhomLong")] 
     public string toWhom { get; set; } 

     [Display(Name = "permitNumber", ResourceType = typeof(Resources.Resources))] 
     [Required(ErrorMessageResourceType = typeof(Resources.Resources), 
        ErrorMessageResourceName = "permitRequired")] 
     [Range(0, 10000, ErrorMessageResourceType = typeof(Resources.Resources), 
         ErrorMessageResourceName = "permitRange")] 
     public int permitNumber { get; set; } 

     [Display(Name = "magazine", ResourceType = typeof(Resources.Resources))] 
     [Required(ErrorMessageResourceType = typeof(Resources.Resources), 
       ErrorMessageResourceName = "magazineRequired")] 
     public bool magazine { get; set; } 


     [Display(Name = "entranceTime", ResourceType = typeof(Resources.Resources))] 
     [DataType(DataType.Date)] 
     public DateTime? entranceTime { get; set; } 


     [Display(Name = "entranceTimeTime", ResourceType = typeof(Resources.Resources))] 
     public string entranceTimeTime { get; set; } 


     [Display(Name = "exitDate", ResourceType = typeof(Resources.Resources))] 
     [DataType(DataType.Date)] 
     public DateTime? exitDate { get; set; } 


     [Display(Name = "exitTime", ResourceType = typeof(Resources.Resources))] 
     public string exitTime { get; set; } 
    } 

    public class GuestDBContext : DbContext 
    { 
     public DbSet<Guest> Guests { get; set; } 
    } 
} 

컨트롤러 :

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Linq; 
using System.Net; 
using System.Web; 
using System.Web.Mvc; 
using Guestbook.Models; 

namespace Guestbook.Controllers 
{ 
    public class GuestsController : BaseController 
    { 
     private GuestDBContext db = new GuestDBContext(); 

     // GET: Guests 
     public ActionResult Index() 
     { 
      //Sortowanie po nazwisku. 
      var guests = from s in db.Guests select s; 
      guests = guests.OrderBy(s => s.surname); 
      return View(guests.ToList()); 
     } 

     // GET: Guests/Details/5 
     public ActionResult Details(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Guest guest = db.Guests.Find(id); 
      if (guest == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(guest); 
     } 

     // GET: Guests/Create 
     public ActionResult Create() 
     { 
      return View(); 
     } 

     // POST: Guests/Create 
     // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create([Bind(Include = "ID,name,surname,firm,toWhom,permitNumber,magazine,entranceTime,entranceTimeTime,exitDate,exitTime")] Guest guest) 
     { 
      guest.entranceTime = DateTime.Today; 
      guest.exitDate = DateTime.Today; 
      DateTime dt = DateTime.Now; 
      string format = "HH:mm:ss"; 
      guest.entranceTimeTime = dt.ToString(format); 
      guest.exitTime = dt.ToString(format); 
      if (ModelState.IsValid) 
      { 
       db.Guests.Add(guest); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(guest); 
     } 

     // GET: Guests/Edit/5 
     public ActionResult Edit(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Guest guest = db.Guests.Find(id); 
      if (guest == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(guest); 
     } 

     // POST: Guests/Edit/5 
     // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
     // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit([Bind(Include = "exitDate,exitTime")] Guest g) 
     { 

      g.exitDate = DateTime.Today; 
      DateTime dt = DateTime.Now; 
      string format = "HH:mm:ss"; 
      g.exitTime = dt.ToString(format); 
      if (ModelState.IsValid) 
      { 
       db.Entry(g).State = EntityState.Modified; 
       db.Entry(g).Property(gg => gg.name).IsModified = false; 
       db.Entry(g).Property(gg => gg.surname).IsModified = false; 
       db.Entry(g).Property(gg => gg.firm).IsModified = false; 
       db.Entry(g).Property(gg => gg.permitNumber).IsModified = false; 
       db.Entry(g).Property(gg => gg.magazine).IsModified = false; 
       db.Entry(g).Property(gg => gg.toWhom).IsModified = false; 
       db.Entry(g).Property(gg => gg.entranceTime).IsModified = false; 
       db.Entry(g).Property(gg => gg.entranceTimeTime).IsModified = false; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      return View(g); 
     } 

     // GET: Guests/Delete/5 
     public ActionResult Delete(int? id) 
     { 
      if (id == null) 
      { 
       return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
      } 
      Guest guest = db.Guests.Find(id); 
      if (guest == null) 
      { 
       return HttpNotFound(); 
      } 
      return View(guest); 
     } 

     // POST: Guests/Delete/5 
     [HttpPost, ActionName("Delete")] 
     [ValidateAntiForgeryToken] 
     public ActionResult DeleteConfirmed(int id) 
     { 
      Guest guest = db.Guests.Find(id); 
      db.Guests.Remove(guest); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     protected override void Dispose(bool disposing) 
     { 
      if (disposing) 
      { 
       db.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

    } 
} 

보기 :

@model Guestbook.Models.Guest 

@{ 
    ViewBag.Title = @Resources.exitGuest; 
} 

<h2>@Resources.exitGuest</h2> 


@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-horizontal"> 

     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     @Html.HiddenFor(model => model.ID) 

     <div class="form-group"> 
      @Html.LabelFor(model => model.name, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DisplayFor(model => model.name, new { htmlAttributes = new { @class = "form-control" } }) 

      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.surname, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DisplayFor(model => model.surname, new { htmlAttributes = new { @class = "form-control" } }) 

      </div> 
     </div> 

     <div class="form-group"> 
      @Html.LabelFor(model => model.firm, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.DisplayFor(model => model.firm, new { htmlAttributes = new { @class = "form-control" } }) 

      </div> 
     </div> 

     <br /> 
     <div class="form-group"> 
      <div class="col-md-10"> 
       <b>@Resources.leftOk</b> 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" [email protected] class="btn btn-default" /> 
       <input type="button" [email protected] onclick="location.href='@Url.Action("","guests")'" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 
@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 
+0

첫 번째로 숨겨진 입력을 제외한 모든 컨트롤을 만들지 않았으므로 다시 게시 할 수 있습니다. 둘째로'[Bind (Include = "exitDate, exitTime")]'를 지정하면, 다시 게시 한 ID도 무시되므로 물론 각 속성은 'null'이거나 기본값입니다. –

+0

편집 기능이 시작될 때 @DavidG -'exitDate'와'exitTime'는 null입니다. @StephenMuecke 광고 1. 모든 변수에 대해'@ Html.HiddenFor()'를 써야합니까? 광고 2. 모든 변수와 변수를 포함 시키려고했습니다. 작동하지 않습니다. – Zashi

+0

숨겨진 입력 (텍스트 상자 또는 속성을 편집하기위한 다른 컨트롤이 필요하므로 편집 양식) 만 추가하는 것은 그리 중요하지 않습니다. 그냥 [Bind (Include -...)] 비트를 잊어 버리십시오. 모든 속성은 기본적으로 바인딩됩니다 (다시 게시하는 한!). 사용하는 경우보기 모델을 사용해야합니다. –

답변

2

첫째로보기에 당신은 단지 ID 매개 변수 단일 형태의 변수를 출력한다. 다른 모든 모델 특성 만 표시됩니다. 다시 게시하려면 EditorFor 또는 HiddenFor과 같이 출력해야합니다.

public ActionResult Edit([Bind(Include = "exitDate,exitTime")] Guest g) 

Bind attribute

다른 모든 null로 표시됩니다 있도록에만 exitDateexitTime 속성을 바인딩에 MVC 모델 바인더를 말하고있다 :

둘째 당신의 Edit 방법, 방법 서명이 있습니다. 당신은 속성을 제거 할 수 있습니다 :

public ActionResult Edit(Guest g) 

을 또는 당신이 전달하는 데 필요한 다른 속성에 추가 : 당신은 그 두 가지 문제를 결합 할 경우 그조차 ID 속성을 볼 수 그래서

public ActionResult Edit([Bind(Include = "exitDate,exitTime,name,surname,etc...")] Guest g) 

통과하지 않고 모든 것이 null입니다.

+0

감사합니다. 그것은 작동합니다! 'EditorFor'에서'DisplayFor'를 화면에 표시하고자하는 매개 변수로 바꿨고 다른 사람들에게'HiddenFor'를 추가했습니다! 나는 또한 Bind 속성을 제거했다. – Zashi

2

사용

@Html.TextBoxFor(... 

대신

@Html.DisplayFor(.... 

그 방법의보기는 양식 제출 후 컨트롤러 '편집'HttpPost ActionResult로 전달합니다.


@Html.DisplayFor(... 

만 화면에 모델 출력 사용된다.그것은, 그러나, 그들이 이런 방식으로 편집 할 수 없습니다 (따라서 사용하는 TextBoxFor 또는 대신 EditorFor)


당신이 원하는 경우에 너무 확실하지 해요 'exitDate'와 exitTime 수동으로 편집하거나 그렇지 않다면, 그렇다면 뷰에 추가하고 모델에 추가 한 후에 Binding Property에 추가해야합니다. 당신이 경우에

후 사용 무언가 같이 : 대신 데이터

바인딩의

(Guest guest) 

• 그래도 바인딩을 포함해야한다.

+1

도움 주셔서 감사합니다. 불행히도 투표 업은 15 개의 평판이 필요하기 때문에 투표 할 수는 없지만 귀하의 답변도 저에게 도움이되었습니다. :) – Zashi

+0

np 기쁘게 정렬되어있어 :) –

관련 문제