2012-05-23 3 views
1

내 데이터베이스에 Review라는 테이블이 있고 Entity Framework를 사용하여 읽기/쓰기 작업 및보기로 ReviewController를 만들었습니다. 그래서 모든 스캐 폴드 코드입니다.양식에서 외래 키 값을 숨기는 방법

이것은 내 편집 페이지입니다.

@model UniversityApp.Models.Review 
@{ 
    ViewBag.Title = "Edit"; 
} 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Review</legend> 

    @Html.HiddenFor(model => model.ReviewID) 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.MovieID, "Movie") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("MovieID", String.Empty) 
     @Html.ValidationMessageFor(model => model.MovieID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.UserID, "User") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("UserID", String.Empty) 
     @Html.ValidationMessageFor(model => model.UserID) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Rating) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Rating) 
     @Html.ValidationMessageFor(model => model.Rating) 
    </div> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.Description) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Description) 
     @Html.ValidationMessageFor(model => model.Description) 
    </div> 

    <p> 
     <input type="submit" value="Save" /> 
    </p> 
</fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

스캐 폴딩 메커니즘에서 볼 수 있듯이 외부 값 키에 대한 편집기가 추가되었습니다. 이미 사용자가 직접 검토 한 후에 사용자 ID 나 영화 ID를 수동으로 변경할 수 없도록하기 위해이 코드를 제거했습니다. 해당 기본 키 값이 존재하지 않기 때문에 외부 키 값을 삽입 할 수 없습니다

:하지만 편집 검토 항목에 나는 데이터베이스 SaveChanges를()에이 오류가 발생합니다. [외래 키 제약 이름 = Review_User]

이전 사용자 ID 및 영화 ID 값을 보존하려면 내 수정 작업을 어떻게해야합니까?

여기 ReviewController에서 편집 작업에 대한 코드입니다 :

public ActionResult Edit(int id) 
{ 
    Review review = db.Reviews.Find(id); 
    ViewBag.MovieID = new SelectList(db.Movies, "MovieID", "Title", review.MovieID); 
    ViewBag.UserID = new SelectList(db.Users, "UserID", "UserName", review.UserID); 
    return View(review); 
} 

[HttpPost] 
public ActionResult Edit(Review review) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(review).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    ViewBag.MovieID = new SelectList(db.Movies, "MovieID", "Title", review.MovieID); 
    ViewBag.UserID = new SelectList(db.Users, "UserID", "UserName", review.UserID); 
    return View(review); 
} 

편집 : 나는 방법 설명 시도,하지만 난 여전히 문제가 발생하고

. 이제 얻을 수있는 오류 메시지는 다음과 같습니다. 참조 무결성 제약 조건 위반이 발생했습니다. 참조 제약 조건을 정의하는 속성 값이 관계의 주체 및 종속 개체간에 일치하지 않습니다. 내가 뭘 잘못하고 있는지 모르겠다. 이 오류는 코드 줄에 trigered된다

db.Entry(review).State = EntityState.Modified; 
+0

우리의 솔루션으로 인해 도움을받을 수 있습니까? 안녕하세요 –

+0

질문이 업데이트되었습니다. – Anajrob

+0

새로운 문제입니다. 새로운 오류 –

답변

2

에 열을 자동으로 생성하고 싶지 않아요 당신의 ViewModels이 가진 재산 전자에 대한

@Html.HiddenFor(x => x.Review_UserID) 

등, 등 :이 방법으로 뷰 모델을 장식하지 않으려면 CD 스미스의 아주 좋은 제안 이외에, 당신은 또한 숨겨진 필드를 추가 할 수 있습니다,이 같을 것 ach FK를 폼에 넣고 싶지만 볼 수는 없습니다. 물론 이것은 [ScaffoldColumn(false)] 데코레이터가 작동하는 방식과 비슷하지만 [HiddenInput(DisplayValue = false)] 속성을 추가하면이 작업이 명시 적으로 수행됩니다.

+0

의 특징과 관련하여 새로운 질문을 시작하고 싶습니다. 그는 실제로 숨겨진 필드를 가지고 있습니다. 소스에서 가지고 싶지 않은 인상을 받고있었습니다 ... 하지만 고마워! 나는 널지지했다! –

+0

cd - 오 그래, 나도 그래. 좋아, 아마도 [HiddenInput (DisplayValue = false)] 또는 [ScaffoldColumn (false)] 이 그에게 도움이 될 수 있습니다. 작은 힌트를 편집했다 –

+0

나는 [HiddenInput (DisplayValue = false)] 속성에 대해 몰랐다. –

2

주석 템플릿 뷰

[ScaffoldColumn(false)] 
public int ReviewID;