0

Ajax.BeginForm을 사용하기 전까지 제대로 작동하는 enum의 편집기 템플릿을 만들었습니다. 다음과 같이 정의되어있다 status 속성은 :Ajax.BeginForm 및 Html.BeginForm을 호출 한 후에도 편집기 템플릿이 작동하지 않습니다.

@Using Ajax.BeginForm("New", "Os", Nothing) 
    @Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)}) 
End Using 

@Ajax.BeginForm("New", "Os", Nothing) 

@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)}) 

@Using Html.BeginForm() 
    @Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)}) 
End Using 

0 :

<DisplayName("Status")> 
<UIHint("enum")> 
Public Property status As String 

는 이미 다음 approachs 시도

@Html.BeginForm() 
@Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)}) 

위 작업 중 아무 것도 작동하지 않았습니다. .BeginForm 메소드를 호출 한 후

@ModelType String 

@code 

    Dim options As IEnumerable(Of OsStatus) 
    options = [Enum].GetValues(ViewData("enumType")).Cast(Of OsStatus)() 


    Dim list As List(Of SelectListItem) = 
      (from value in options 
      select new SelectListItem With { _ 
       .Text = value.ToString(), _ 
       .Value = value.ToString(), _ 
       .Selected = value.Equals(Model) _ 
      }).ToList() 
    End If 
End Code 

@Html.DropDownList(Model, list) 

을 다음과 같이

내 템플릿의 코드는, 내 템플릿은 여전히라고하지만, 내 템플릿 내부의 Model 속성은 null입니다.

아이디어가 있으십니까?

답변

1

내가 편집기 템플릿 적어도 4 문제를 볼 수 있습니다 개방하지 않고 당신이 End If

  • If 그래서 당신의 편집기 템플릿은 선택된 값을 결정하기 위해 예외
  • 를 던질 가능성이 높습니다 열거 형 값을 문자열로 비교하는 경우 value.Equals(Model) 문자열과 문자열을 비교해야합니다. value.ToString().Equals(Model)
  • 드롭 다운 목록을 렌더링 할 때 Model 값을 사용하는 반면 빈 st 부모 속성에서이 드롭 다운 목록에 올바른 이름을 지정하기 위해 호출합니다.
  • 편집기 템플릿은 내부에 캐스팅 할 때 OsStatus 열거 형에 연결됩니다. 이 편집기 템플릿을 좀 더 일반적이고 재사용 할 수있게 만드는 것이 좋을 것입니다.

여기에 올바른 방법 :

@ModelType String 

@code 
    Dim options = [Enum].GetValues(ViewData("enumType")).Cast(Of Object)() 

    Dim list As List(Of SelectListItem) = 
      (From value In options 
      Select New SelectListItem With { _ 
       .Text = value.ToString(), _ 
       .Value = value.ToString(), _ 
       .Selected = value.ToString().Equals(Model) _ 
      }).ToList() 
End Code 

@Html.DropDownList("", list) 

그리고 그것을 호출하는 올바른 방법은 다음과 같습니다 이제

@Using Html.BeginForm("New", "Os", Nothing) 
    @Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)}) 
End Using 

이보기를 렌더링 할 때 확인 :

@Using Ajax.BeginForm("New", "Os", Nothing) 
    @Html.EditorFor(Function(m) m.status, "Enum", New With { .enumType = GetType(OsStatus)}) 
End Using 

또는 제어기 동작이 실제로 모델을 통과하고 01을 가짐문자열 속성을 열거 형에 포함 된 일부 문자열 값으로 설정하여 드롭 다운에서 올바른 옵션을 자동으로 미리 선택할 수 있습니다.

+0

모든 지점에서 옳습니다. 하지만 .. 1.'End If'는 단순함을 위해 코드를 줄이는 동안주의가 부족한 결과였습니다. 2. 나중에 비교를 수정했는데 그 원인이 아니 었습니다. 3.'Model'을 이름으로 사용하는 중에도 오류가 발생했습니다 하지만 정말 좋은 팁은'Cast'의 일반화에 문제가 발생되지 않았다 (명성!) 나는'.BeginForm' 메소드를 호출하고 있지 않다 경우 내가, 짧은에, 왜 모르겠지만, 해당 템플릿이 작동합니다. '.BeginForm'을 사용하고 있다면 ** 나는 Os를 생성 할 때 null 모델에 대한 드롭 다운을 렌더링하기 위해 에디터에 조건을 추가해야합니다. 감사합니다. – svallory

관련 문제