2013-08-06 2 views
1

를 만들 때 객체 탐색 속성에 대한 참조를 유지하는 방법에는 다음과 같은 편집보기의 일환으로 : -새로운 객체

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
@Html.HiddenFor(model => model.Rack.RackID) 
@Html.HiddenFor(model => model.Resource.RESOURCEID) 
@Html.HiddenFor(model => model.Rack.timestamp) 
@Html.HiddenFor(model=>model.Rack.Technology) 
<span class="f"> @Html.TextBoxFor(model => model.Rack.Technology.Tag, new 
{ @readonly = "readonly" })</span> 
<span class="f">Rack Name </span> 


@Html.EditorFor(model => model.Resource.RESOURCENAME) 

      @Html.ValidationMessageFor(model => model.Resource.RESOURCENAME)            
</div> 

<div > 
<span class="f">Product Name </span> 

    @Html.DropDownList("productName", ((IEnumerable<TMS.Models.ComponentDefinition>)ViewBag.Products).Select(option => new SelectListItem { 
     Text = (option == null ? "None" : option.COMPONENTNAME), 
     Value = option.COMPONENTNAME.ToString(), 
     Selected = (Model != null) && (Model.Resource.ComponentDefinition != null) && (option.COMPONENTNAME == Model.Resource.ComponentDefinition.COMPONENTNAME) 
    }), "Choose...") 
    @Html.ValidationMessageFor(model => model.Resource.COMPONENTID) 
</div> 


    <input type="submit" value="Save" class="btn btn-primary"/> 
    }</div> 

나는 다음 포스트 편집 액션 메소드를 가지고있다 -

[HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Edit(RackJoin rj,FormCollection formValues) 
     { 
      string controllername = RouteData.Values["controller"].ToString(); 
      try 
      { 
       if (ModelState.IsValid) 
       { 
        var message = ""; 
        var status = ""; 
        long assetid = new long(); 
        XmlDocument doc = new XmlDocument(); 
        using (var client = new WebClient()) 
        { var query = HttpUtility.ParseQueryString(string.Empty); 
         foreach (string key in formValues) 
         { 
          query[key] = this.Request.Form[key]; 
         } 

과 RackJoin 모델 클래스입니다 : -

public class RackJoin 
    { 
     public Rack Rack { get; set; } 
     public Resource Resource { get; set; }} 

하지만이 직면하고있는 문제는 내가 산부인과 다시 게시 할 때이다 포스트 편집 액션 메소드를 사용하여 (Rack.Technology, Rack.SiteDefinistion)과 같은 모든 네비게이션 속성을 풀어 모든 오브젝트 탐색 속성을 유지 관리 할 수 ​​있습니다. 따라서 포스트 편집 액션 메소드가 이러한 탐색에 액세스하려고한다면 속성 또는 편집 뷰가 모델 상태 오류 후에 렌더링되면 null 참조 예외가 발생하지 않습니다.

+1

보기에 모델 정보를 유지하고 서버에 게시하는 경우 정보를 유지해야합니다. – James

+0

이 일은 내가하려고하는 일이지만 실패했습니다. 예를 들어 나는 "@ Html.HiddenFor (model => model.Rack.Technology)"라고 쓰는 것이 기술 탐색을 랙에 게시 할 것이지만이 숨겨진 필드를 쓰면 model.state가 mvc로 false가됩니다. Rack.Technology를 문자열로 변환 할 수 없습니다! –

+1

생성 된 HTML을 검사 했습니까? ''와 비슷하게 보일 것입니다. 기본으로 돌아가서 아주 간단한 모델 (속성이 적은)부터 시작하여 문제를 일으킬 때까지 점진적으로 속성을 소개합니다. – James

답변

2

Technology은 복잡한 유형이므로 HiddenFor을 통해 렌더링 할 수 없기 때문에이 속성에 대한 모든 정보를 유지해야하는 경우 각 속성을 개별적으로 렌더링해야합니다.

@Html.HiddenFor(model => model.Rack.Technology.Name) 

그러나 여기에 디자인에 대한 질문이 시작됩니다. 많은 정보가이 특정 뷰와 관련이 없다면 실제로는 존재하지 않아야합니다. 보기 모델은 그래서 더 복잡한 유형은, 예를 들어이없는 것처럼이 뷰 렌더링을 단순화해야에만 즉

public class RackJoinViewModel 
{ 
    public int RackID { get; set; } 
    public int ResourceID { get; set; } 
    public DateTime TimeStamp { get; set; } 
    public string Technology { get; set; } 
    ... 
} 

관련 정보를 캡처하도록 설계된 특정 모델을 가지고 추천 할 것보기에 맞게 조정해야한다

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 
    @Html.HiddenFor(model => model.RackID) 
    @Html.HiddenFor(model => model.ResourceID) 
    @Html.HiddenFor(model => model.TimeStamp) 
    @Html.HiddenFor(model => model.Technology) 
    ... 
} 

이 깨끗뿐만 아니라뿐만 아니라 요청에서 관련없는 정보를 유지하려고하는 문제를 근절.