2012-08-07 5 views
3

화면에 인쇄하는 데이터 목록이 있습니다. 화면 하단 (스크롤)에는 사용자가 데이터를 입력 할 수있는 텍스트 필드가있는 양식이 있습니다. 제출을 클릭하고 양식이 유효하지 않으면 오류가 올바르게 표시되지만 사용자는 현재 찾고 있습니다. 페이지 맨. 따라서 페이지 하단에 오류가 있음을 알 수 없습니다. 사용자가 오류가 발생했음을 알 수 있도록 페이지 맨 아래의 양식으로 건너 뛰고 싶습니다.양식 게시 후 오류로 이동 mvc3 .net

앵커 사용에 대해 생각했지만 문제가 있습니다. 양식이 유효하지 않다는 것을 알았을 때 컨트롤러에 이미 있기 때문에 URL에 해시 태그를 첨부 한 동일한 컨트롤러로 다시 리디렉션해야합니다. 나에게 이것은 좋은 습관과 약간의 낭비처럼 보이지 않는다.

누구든지 더 좋은 방법을 알고 있습니까?

+0

클라이언트 측 유효성 검사에 반대하십니까? 그러면 오류 메시지가 나타납니다. 게시하지 않고 제출을 클릭하면 ... –

+0

jQuery 솔루션 - http://stackoverflow.com/questions/9363508/scroll-to-validation-summary-asp-net-mvc/ 9382969 # 9382969 –

+0

음, 두 가지 문제가 있습니다. 하나는 MicrosoftAjax.js, MicrosoftMvcAjax.js 및 MicrosoftMvcValidation.js입니다. 또한이 : 이 <키 = "UnobtrusiveJavaScriptEnabled"값 = "true"를 추가 /> 하지만, 내가 실행할 때 <= "true"로/키 = "ClientValidationEnabled"값을 추가>가 디버그 모드에서 여전히 내 컨트롤러를 때리고있다. 또한 JS가 꺼져있는 경우이 솔루션을 사용하고 싶습니다. – ScubaSteve

답변

3

이렇게하는 한 가지 방법은 항상 앵커에 게시하고보기에서 앵커를 둘 위치를 결정하는 것입니다. 모델 오류가 있으면 명명 된 앵커를 페이지의 맨 아래에 놓고 오류가 없으면 앵커를 페이지 맨 위에 놓습니다. 이것을 복잡하게하는 한 가지는 앵커를 취하는 Html.BeginForm 오버로드가 없다는 것입니다. 내 대답 당신은 단순히이

<form action="@Url.Action("actionName", "controllerName")#anchor_name" method="post"> 

    ..... form contents ..... 

</form> 

처럼 달성 할 수 또는 @Html.CustomBeginForm('action', 'controller', 'anchor_name')

This question를 사용할 수있는 사용자 정의 HTML 도우미 그런

public static class FormExtensions 
{ 
    public static MvcForm CustomBeginForm(this HtmlHelper htmlHelper, string actionName, string controllerName, string fragment) 
    { 
     var formAction = UrlHelper.GenerateUrl(null, actionName, controllerName, htmlHelper.ViewContext.HttpContext.Request.Url.Scheme, null, fragment, null, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true); 
     var builder = new TagBuilder("form"); 
     builder.MergeAttribute("action", formAction); 
     builder.MergeAttribute("method", "post", true); 
     htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag)); 
     return new MvcForm(htmlHelper.ViewContext); 
    } 
} 

를 작성할 수 유용 및 정보

+0

폼의 ID도 설정할 수 있기를 바 랐기 때문에 고맙습니다. 아래 코드를 게시 할 것입니다. – ScubaSteve

1
public static MvcForm BeginFormAnchor(this HtmlHelper htmlHelper, string actionName, string controllerName, object routeValues, FormMethod method, object htmlAttributes, string hashTag) 
    { 
     var formAction = UrlHelper.GenerateUrl(null, actionName, controllerName, htmlHelper.ViewContext.HttpContext.Request.Url.Scheme, null, hashTag, ConvertToRouteValueDictionary(routeValues), htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, true); 
     var builder = new TagBuilder("form"); 
     builder.MergeAttribute("action", formAction); 
     builder.MergeAttribute("method", method.ToString(), true); 
     foreach (KeyValuePair<string, string> attribute in ConvertToDictionaryStringString(htmlAttributes)) 
     { 
      builder.MergeAttribute(attribute.Key, attribute.Value); 
     } 
     htmlHelper.ViewContext.Writer.Write(builder.ToString(TagRenderMode.StartTag)); 
     return new MvcForm(htmlHelper.ViewContext); 
    } 

    private static Dictionary<string, string> ConvertToDictionaryStringString(object obj) 
    { 
     return obj.GetType().GetProperties().ToDictionary(o => o.Name, o => o.GetValue(obj, null).ToString()); 
    } 

    private static RouteValueDictionary ConvertToRouteValueDictionary(object obj) 
    { 
     RouteValueDictionary rvd = new RouteValueDictionary(); 
     PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj); 
     foreach (PropertyDescriptor prop in props) 
     { 
      rvd.Add(prop.Name, prop.GetValue(obj)); 
     } 
     return rvd; 
    } 

다음과 같은 형식으로 지정합니다.

@using (Html.BeginFormAnchor("Action", "Controller", new { id = Model.ID }, FormMethod.Post, new { @id = "formID" }, "anchorName"))