2016-06-21 3 views
1

나는 조언을 찾고있다. 현재 MVC 5 프로젝트, 매우 얇은 뷰와 컨트롤러, 웹 API 2를 사용하고 있습니다. 브라우저에서 모든 사용자 상호 작용 클라이언트 측을 처리하는 각도 1.4를 사용하고 있습니다. 대부분의 도착 및 게시물은 각도 및 웹 API간에 처리됩니다. 나는 일반적인 MVC 패턴, 훌륭한 JS 프레임 워크, JS 유닛 테스팅으로 두 세계의 장점을 모두 누리고 있다고 느낄 때이 접근 방식을 좋아한다. 이제는 사용자 역할이 2 가지 유형인데 하나는 편집 가능한 다른 역할은 편집 할 수없는보기에 액세스 할 수 있습니다. 나는 많은 모서리 템플릿을 면도칼로 옮겨서 이것을 성취하려고 생각하고있다. 그리고 누군가가 이것을 위해 깨끗한 전략을 가지고 있는지 궁금해했다. 기본적으로 사용자가 특정 html 요소에 액세스 할 수없는 경우 와이어 아래로 보내지 않고 편집 가능한 뷰 또는 편집 할 수없는 뷰에 대해 별도의 mvc 뷰 또는 각도 템플릿을 만들지 않으려합니다.Asp.net mvc 5 각도 1.4 하이브리드 잠그는보기

감사!

답변

0

이것은 주관적이며 다른 의견이 나옵니다.

나는 편집과 각 모델을보기 위해 별도의보기를 원하지 않는 같은 문제에 직면했다. 그래서 나는 그것의 내부에 두 개의 구성 요소로 외부 div를 만든 mvc 도우미를 만들었습니다. 하나는보기 용이고 다른 하나는 편집 용입니다. 나는 편집과보기 사이에서 바꾸기 위해 사용했던 일반적인 각도 변수를 가졌다. 효과는 html이 더 크지 만 cshtml은 여전히 ​​작고 읽기 쉽습니다.

악의적 인 사용자가 편집 가능한보기로 수동 전환 할 수는 있지만 사실은 사용자가 액세스 할 수 없다면 변경 사항을 저장할 수 없다는 것입니다 (제한 사항으로 인해 업데이트/작성 게시물.

내가 볼때는, 당신은 몇 가지 옵션이 있습니다.

  1. 가 올바른 템플릿을 각도에서 편집/편집 할 템플릿을 만들고 얻을.
  2. 이 지침을 확인 그 편집 가능한보기를 바꿉니다 (또는 그 반대) 편집 모드 일 때.
  3. 템플릿을 면도기 템플릿으로 변환하고 편집보기와 비 편집보기
  4. 템플릿을 면도기 템플릿으로 변환하고 원하는보기를 도우미가 만들도록하십시오.

의견을 얻은 후에 # 3 또는 # 4를 원하는 것처럼 보입니다. # 4는 1 개의 파일 만 변경하고 두 가지보기 모두에 영향을 미칠 수 있도록 1 개의 면도기 템플릿 (예 : 광산)을 만듭니다. 이것은 당신에게 도움이 될 수 있지만 편집/비 편집보기에 대한 마크 업의 일관성에 달려 있습니다.

예 도우미 텍스트 상자 및 공통 기본 요소 (옵션 # 4)

public static MvcHtmlString TextboxFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null) 
{ 
    var dict = new RouteValueDictionary(htmlAttributes ?? new object { }); 
    var tag = new TagBuilder("span");//default view 
    if((bool) helper.ViewContext.Controller.ViewBag.CanEdit){//edit view 
     tag = new TagBuilder("input"); 
     tag.Attributes.Add("class", "form-control"); 
     if (!dict.ContainsKey("type")) 
     { 
      tag.Attributes.Add("type", "text");//default input type 
     } 
    }else 
    { 
     var value = ModelMetadata.FromLambdaExpression(
      expression, helper.ViewData 
      ).Model; 
     tag.InnerHtml = value.ToString(); 
    } 
    return BaseNode(helper, expression, tag, TagRenderMode.SelfClosing, dict); 
} 
public static MvcHtmlString BaseNode<TModel, TProperty>(HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression, TagBuilder tag, TagRenderMode tagRenderMode, RouteValueDictionary dict) 
{ 
    var name = ExpressionHelper.GetExpressionText(expression); 
    var fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); 
    var id = TagBuilder.CreateSanitizedId(fullName); 
    var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData); 


    tag.Attributes.Add("name", fullName); 
    tag.Attributes.Add("id", id); 

    foreach (var dKey in dict.Keys) 
    { 
     var value = dict[dKey].ToString(); 
     var key = dKey.Replace("_", "-"); 
     tag.Attributes.Add(key, value); 
    } 


    return new MvcHtmlString(tag.ToString(tagRenderMode)); 
} 
+0

감사 @Bryan, 그게 내가, 내가 클라이언트의 편집 가능한 HTML을하지 않으 싶지 않아 무엇을 효율적이다, 이것은 약간의 JS 지식을 가진 클라이언트가 변수를 설정할 수있는 능력을 가지며 편집 가능한 뷰를 가지고 있습니다 (포스트에서 얻은 것입니까?) 많은 템플릿을 면도기로 다시 변환하는 것 이외에는 어떤 방식으로도 보지 못합니다 뭐하는거야? –

+0

@BobS 내가 보는 모든 옵션과 내가 사용하는 코드 중 일부를 제공하기 위해 내 대답을 업데이트했습니다. (내가 뭘하고 싶은지 더 잘 맞게 수정했습니다) –

+0

Bryan에게 감사드립니다. 옵션 3은 안전하다고 생각됩니다. 내기하지만 4 흥미로운 조사를 할 것입니다 ... –