2013-04-30 5 views
0

이 문제에 대한 게시물이 많이 있지만 올바른 해결책을 찾을 수 없습니다. 현재 내 모델, 뷰 컨트롤러는 다음과 같다 :POST 동작 후 복잡한 모델이 null입니다.

보기 :

@model Pro.Web.Models.CatDetailsView 

@using (Html.BeginForm("Details", "Cat", Model, FormMethod.Post)) 
{ 
@Html.AntiForgeryToken() 
@Html.ValidationSummary() 

<h2>Details</h2> 

<ol> 
    <li> 
     @Html.LabelFor(model => model.Cat.Name) 
     <p>@Html.DisplayFor(model => model.Cat.Name, new { @readonly = "true" })</p> 
    </li> 

    <li> 
     @Html.LabelFor(model => model.Cat.Owner) 
     <p>@Html.DisplayFor(model => model.Cat.Owner.UserName, new { @readonly = "true" })</p> 
    </li> 

    <li> 
     @Html.LabelFor(model => model.Cat.BornDate) 
     <p>@Html.DisplayFor(model => model.Cat.BornDate, new { @readonly = "true" })</p> 
    </li> 

    <li> 
     @Html.LabelFor(model => model.Cat.Age) 
     <p>@Html.DisplayFor(model => model.Cat.Age, new { @readonly = "true" })</p> 
    </li> 


    <li> 
     @Html.LabelFor(model => model.Cat.CatColorValue) 
     <p>@Html.DisplayEnumFor(model => model.Cat.CatColorValue, typeof(Pro.Web.Models.Entities.Enums.CatColor))</p> 
    </li> 

    <li> 
     @Html.LabelFor(model => model.Cat.Description) 
     <p>@Html.DisplayFor(model => model.Cat.Description, new { @readonly = "true" })</p> 
    </li> 

</ol> 

<input type="submit" value="Edit details" name="Command" /> 

} 

모델 :

public class CatDetailsView 
{ 
    public Cat Cat { get; set; } 
} 

컨트롤러 :

[HttpPost] 
    public ActionResult Details(CatDetailsView model, string Command) 
    { 
     if (Command.Equals("Edit details")) 
     { 
      Cat cat = this._catRepository.Find(model.Cat.Id); 
      if (cat != null) 
      { 
       return RedirectToAction("Edit", "Cats", new { id = cat.Id }); 
      } 
      else 
      { 
       return View(model); 
      } 
     } 

     else 
     { 
      return View(model); 
     } 

    } 
,

문제는 컨트롤러가 항상 모델에 대해 null을 받는다는 것입니다. 나는 그 코드를보고 있으며 무엇이 잘못되었는지를 볼 수 없다. 나는 방금 학습을 시작 했으므로 나는 사소한 것을 놓친 것 같다. 나는 누군가가 문제가 될 수있는 아이디어가 있기를 바랍니다.

감사합니다.

답변

4

EditorFor 대신 DisplayFor를 사용하고 있으므로 제출하지 않을 것입니다.

DisplayFor는 데이터를 표시하는 데 사용됩니다.

EditorFor는, 텍스트 상자, 라디오 버튼과 같은 폼 입력 요소를 추가, 체크 상자 등


sormii는 의견이 언급 편집 내가 대답에 추가합니다하는 데 사용됩니다. 사용자가 게시 할 값을 변경할 수있게하려면 EditorFor를 사용해야하지만 데이터를 표시하기 만하면 (변경 허용 안함) 각 DisplayFor 후에 HiddenFor를 사용할 수 있습니다. 이것은 게시 될 숨겨진 입력을 넣습니다.

당신이 readonly = true를 사용하려고하는 것처럼 보입니다. 그렇게하기 위해 TextBoxFor를 사용하고 싶을 것 같습니다.

+1

결론 : 디스플레이 값을 게시하려면 HiddenFor with DisplayFor를 사용하십시오. –

+0

감사합니다. 이 작품! 나는 값을 필요로하는 모든 곳에서'HiddenFor'를 넣었습니다. 이제 컨트롤러에서 그 값을 얻을 수 있습니다. – Cristiano

관련 문제