2010-07-22 3 views
0

편집보기에서 슬러그 용 텍스트 상자를 렌더링하는 이상한 문제가 발생하여 사용자는 편집중인 내용의 슬러그를 볼 수 있지만 변경할 수는 없습니다. 텍스트 상자가 활성화 된 작성보기에서만 슬러그를 변경할 수 있습니다. 편집보기에서는 제목 만 변경할 수 있습니다.비활성화 된 텍스트 상자가 하나의보기에는 게시되지만 다른 사용자에게는 표시되지 않습니다.

편집보기에서 슬러그 텍스트 상자는 전달 된 ViewModel에서 채워지고 이것이 작동합니다.

그러나 변경 사항을 게시 할 때 슬그개는 하나의 콘텐츠 유형 (올바른 동작이라고 생각합니다)의 편집보기에 게시되지 않으며 Model.IsValid (필수 속성이 있기 때문에) 슬러그 속성에 연결됨) 실패합니다. 이것은 말했듯이 올바른 행동입니다.

다른 유형의 콘텐츠에 대한 편집보기에있는 것이 비활성화 된 텍스트 상자의 콘텐츠가 게시되고 게시 된보기 모델이 유효하며 슬러그 값이 변경되지 않은 것을 확인할 수도 있습니다.

내가 코드를 게시 할 수 있지만, 사람들은 아주 큰 뷰, 제목 및 슬러그 텍스트 상자를 렌더링 코드 그러나 관련 섹션입니다 모두 작성/편집 뷰에 대한 두 콘텐츠 형식에서 동일한이며 이것이다 :

... 다른 경우 편집 할 때 ... 문 우리 만 슬러그 텍스트 상자를 사용하지 않도록 때문이 왜 내가 모두 생성 및 편집에 대해 하나의 부분 뷰를 사용하고
<div class="editor-label"> 
    <%= Html.LabelFor(model => model.Title, Resources.Localize.Section_Title)%> 
</div> 
<div class="editor-field"> 
    <%= Html.TextBoxFor(model => model.Title) %> 
    <%= Html.ValidationMessageFor(model => model.Title) %> 
</div> 
<div class="editor-label"> 
    <%= Html.LabelFor(model => model.Slug, Resources.Localize.Section_Slug)%> 
</div> 
<div class="editor-field"> 
    <% if (string.IsNullOrWhiteSpace(Model.Slug)) 
{ %> 
    <%= Html.TextBoxFor(model => model.Slug)%> 
    <% } 
else 
{ %> 
    <%= Html.TextBoxFor(model => model.Slug, new { disabled = true })%> 
    <% } %> 
    <%= Html.ValidationMessageFor(model => model.Slug) %> 
</div> 

, 즉이다.

누군가가이 사실을 알 수 없기를 바랍니다.

업데이트 :

가장 끔찍한 것. 이 라인 내 뷰 (모두 동일)에서

<form id="Page-CreateEditForm" action="<%=Url.Action(Url.RequestContext.RouteData.GetRequiredString("action"), Url.RequestContext.RouteData.GetRequiredString("controller")) %>" enctype="multipart/form-data" method="post"> 

<form id="Section-CreateEditForm" action="<%=Url.Action(Url.RequestContext.RouteData.GetRequiredString("action"), Url.RequestContext.RouteData.GetRequiredString("controller")) %>" enctype="multipart/form-data" method="post"> 

다음을 생성합니다

양식 시작 태그 페이지의 "테스트 페이지"를 편집 할 때. 민달팽이 : 테스트 페이지. 액션에서 슬러그를 주목하라!

<form id="Page-CreateEditForm" action="/Page/Edit/test-page" enctype="multipart/form-data" method="post"> 

"테스트 섹션"섹션을 편집 할 때 양식 시작 태그. 민달팽이 : 테스트 섹션. 편집 후에 슬러그가 어떻게 사라 졌는지 확인하십시오.

<form id="Section-CreateEditForm" action="/Section/Edit" enctype="multipart/form-data" method="post"> 

이제 동일한 양식 태그 정의로 인해 런타임에 두 가지 다른 동작이 발생합니다.

FOLLOW UP : 물론

,이 global.asax.cs에서 경로 정의에서 줄기, 그래서 거기를 체크 아웃 할 수 있어야합니다 빠른 생각 후. 이것이 우리가 찾는 것입니다 :

 routes.MapRoute(Localize.Routes_PagesEdit, RouteType.Admin, "Page/Edit/{slug}", 
         new {controller = "Page", action = "Edit", slug = ""}, null); 

     routes.MapRoute(
      Localize.Routes_SectionsEdit, 
      RouteType.Regular, 
      "Section/Edit", 
      new {controller = "Section", action = "Edit"}, null 
      ); 

섹션 편집 경로에 {slug} 매개 변수가없는 것을보십시오. 나는 그 해결책에 가까워지고 있다고 생각한다.

+0

실제로 브라우저에서 생성 된 HTML (소스보기)을보고 두보기 모두에서 슬러그가 비활성화되어 있는지 확인 했습니까? –

+0

네, 그게 문제입니다. 둘 다 disabled = "true"로 렌더링되며 둘 다 기존 슬러그 (편집시)로 설정된 값을 갖고 두 텍스트 상자는 모두 회색으로 표시됩니다. 그리고 아직 한 사람은 다른 사람은 올리지 않습니다. – mare

+2

실제로 경로 문제 (슬러그 매개 변수 누락)입니다. 분명히 기본 모델 바인더는 POST에서 URL 쿼리 문자열 매개 변수에서 ViewModel로 바인딩 할 수 있으므로 Slug의 텍스트 상자가 비활성화되어 있어도 쿼리 문자열에서 값을 가져올 수 있습니다. – mare

답변

0

실제로 경로 문제 (슬러그 매개 변수 누락)입니다. 분명히 기본 모델 바인더는 POST에서 URL 쿼리 문자열 매개 변수에서 ViewModel로 바인딩 할 수 있으므로 Slug의 텍스트 상자가 비활성화되어 있어도 쿼리 문자열에서 값을 가져올 수 있습니다.

routes.MapRoute( 
      Localize.Routes_SectionsEdit, 
      RouteType.Regular, 
      "Section/Edit/{slug}", 
      new {controller = "Section", action = "Edit"}, null 
      ); 

routes.MapRoute( 
    Localize.Routes_SectionsEdit, 
    RouteType.Regular, 
    "Section/Edit", 
    new {controller = "Section", action = "Edit"}, null 
    ); 

를 변경하여 문제를 해결했다.

관련 문제