2012-02-28 1 views
1

그래서 기본적으로 위젯으로 연락처 양식 인 과수원 모듈을 만들었습니다. 이 위젯은 모든 페이지 (또는 위젯)에 배치 할 수 있으며 포스트 데이터를 처리하는 컨트롤러에 데이터를 게시합니다. 일단 이메일을 보내면 입력을 요약 한 "보낸"보기가 반환됩니다. 잘못된 모델을 처리하는 데 문제가 있습니다. 코드를 디버깅 할 때 유효성 검사가 완료됩니다.컨트롤러가 위젯이있는 페이지에 동적으로 부품을 반환하도록합니다! ModelState.IsValid

if (!ModelState.IsValid) 
{ 
    //Gets here no problem 
} 

그러나 문제는 내 위젯은 기본적으로 모든 페이지에있을 수 있기 때문에 (글로벌 영역에서 별도의 페이지에서 홈페이지의 모든 페이지에 있도록), 그것의 위젯 또는 일부가 될 수 있다는 것입니다 유형. 모델을 보낸 사람 페이지로 다시 보내는 방법을 모르겠습니다. 나는 몇 가지 옵션이 있다고 생각하고 있습니다.

흥미로운 측면은 내 사이트의 "글로벌"영역에 양식을 넣으면 (모든 페이지에있는 사이드 바처럼, 더 중요한 것은 "보낸"페이지) 그 페이지의 양식은 실제로 "확인"오류가 양식에 렌더링됩니다. 그래서 어떻게 든 명시 적으로 반환하지 않는다고 생각하는 페이지에 내 뷰 - 모델을 전달하는 것입니다.

URL이 더 하위 도메인이없는 경우

가) 어떻게 든 우리 라우트 홈페이지 컨트롤러 또는 무엇이든 (과수원이 그것을 처리하는 방법을 확실하지)

B에 다음) 어떻게 든를 예를 들어 컨트롤러 액션에 보낸 URL을 매핑 핸들러/드라이버 영역에서 수행하십시오. 또한이 작업을 수행하는 방법을 잘 모릅니다.

c) 오히려 이렇게하지 말고 내 컨트롤러가 json 데이터를 반환하고 jquery를 통해 비동기 컨트롤러에 양식을 게시하게하십시오.

답변

-1

Javascript가 활성화되어 있지 않을 때 (또는 Javascript가 비활성화되었을 때 시스템이 장애가 있다고 인정할 수있을 때) 시스템이 작동해야한다는 엄격한 요구 사항이 없으면 개인적으로 JSON/Ajax 방식으로 이동합니다. 게다가 AJAX가 어떤 사이트에서하는지, 당신의 편이 좋은 행동을 해줍니다;).

중 하나 PartialView 또는 PartialAction 등의 연락처 위젯을 렌더링 (중 하나는 아마 당신은 이미이 실행되고, 작동합니다.

@* This is, of course, oversimplified for the sake keeping the post short. 
    I'd be happy to provide more details if you need'em *@ 
<form id="contact" action="@Url.Action("ContactWidget", "Send")" method="post"> 
{ 
    @Html.Textbox("name"); 
    @Html.TextArea("message"); 
    <input type="submit" value="Send" /> 
} 

그런 다음 이상적으로 별도로 포함한다.)이 예에서 일부 자바 스크립트 (및 jQuery를 사용 의 .js 파일 (이 파일을 감안할의 .js가 캐시 할 수 있기 때문에 그것은 당신의 페이지 크기를 줄일 수 있습니다, 모든 사이트를 통해 될 것입니다).

$('form#contact input[type=submit]').on('click', function() { 
    var form = $(this).closest('form'); 
    var data = form.serialize(); 
    var postURL = form.attr('action'); 

    // do the actual post 
    $.post(postURL, data, function (response) { 
     if (response) { 
      form.parent().html($(response)); 
     } 
    }); 

    return false; 
}); 

당신이 얻을 응답과 함께 컨텐츠의 형태의 용기를 대체 할 그 POST 호출에서 벗어났습니다. 컨트롤러의 Send 액션을 구현할 수 있으며, Partial View 컨텐츠로 응답하게하십시오. HTML이 반환하는지 여부는 유효성 검사 오류가있는 양식과 동일한 양식인지 또는 "감사합니다"메시지인지 여부는 귀하에게 달려 있습니다. 은 자바 스크립트가 활성화되지 않은 경우에도, 위젯이 위젯에 전체 브라우저 POST 할 것

public ActionResult Send(SendViewModel model) 
{ 
    if (!ModelState.IsValid) 
     return View("Widget", model); // where "Widget" is the .cshtml with the form 

    // do the actual message sending... 

    // return a thank you note 
    return View("ThankYou"); // where "ThankYou" is the .cshtml with the Thank You message 
} 

주 ... 같은 것을 할 수 있지만, 결과는 단지 문의 양식의 출력됩니다 . 필요한 경우를 제외하고는이 항목으로 이동하지 않지만 POST 처리 후 Request.IsAjaxRequest() 확장명과 HttpReferrer를 사용하여 사용자를 원래 페이지로 리디렉션 할 수 있습니다.