2010-11-25 4 views
0

다른 기능 중 사용자에게 '문의하기'페이지를 제공하는 작은 샘플 웹 사이트를 구축하여 ASP.Net MVC2를 시험해보고 있습니다. 아이디어는 사용자가 자신의 이름, 전자 메일 주소, 메시지 제목 및 메시지를 입력 할 수있게하는 것입니다. 메시지를 보내려면 사용자가 ActionLink를 클릭하십시오. 이것은이다 :보기에서 텍스트 상자의 매개 변수를 ASP.Net의 컨트롤러로 전달 MVC2

<% Html.BeginForm(); %> 
<div> 
    <%: Html.Label("Name")%> 
    <br /> 
    <%: Html.TextBox("txtName", "",new { style = "width:100%" })%> 
    <br /> 
    <%: Html.Label("Email address")%> 
    <br /> 
    <%: Html.TextBox("txtEmail", "", new { style = "width:100%" })%> 
    <br /> 
    <%: Html.Label("Subject")%> 
    <br /> 
    <%: Html.TextBox("txtSubject", "", new { style = "width:100%" })%> 
    <br /> 
    <%: Html.Label("Message")%> 
    <br /> 
    <%: Html.TextBox("txtMessage", "", new { style = "width:100%" })%> 
</div> 
<div style='text-align: right;'> 
    <%: 
     Html.ActionLink("Send", "SentEmail", new { name = Html.g, sender = "txtEmail", subject = "txtSubject", message="txtMessage" }) 
    %>  
</div> 
<% Html.EndForm(); %> 

ActionLink 컨트롤러의 방법은 사용자 이름, 이메일 주소, 제목 및 메시지가 전달됩니다되는 호출을 클릭하고 나면 생각입니다. 내가 링크를 클릭하면

 public ActionResult SentEmail(string name, string sender, string subject, string message) 
    { 
     //Send email here and then display message contents to user. 
     ViewData["Name"] = name; 
     ViewData["Message"] = message; 
     ViewData["ThankyouMessage"] = "Thank you for contacting us. We will be in touch as soon as possible."; 
     return View(); 
    } 

그러나 ... 메소드로 전달되는 값이 null 인 :이 컨트롤러의 방법입니다. 이 작업을 수행하는 경로를 만들려고했지만 작동하지 않습니다. 다른 방법을 사용해야합니까?

모리스

답변

1

액션 링크는 HTTP 포스트를 유발하지 않을 않으며 단지 HTTP GET 및 어떤 형태 통과하지, 양식 필드의 값을 전달합니다에게 감사합니다, 데이터 - 이상적으로는 입력 제출 버튼을 사용하여 데이터를 게시하는 것이 좋습니다. 데이터 작성/업데이트를 야기하는 요청은 http 게시를 통해 수행되어야한다는 것은 좋은 습관입니다.

제출 버튼이 좋아요.

<input type="submit" value="Send" /> 

그런 다음 먼저 당신이 데이터

[HttpPost] 
public ActionResult SendEmail(FormCollection collection) 
{ 
    string email = collection["txtEmail"]; 
    ... 
} 

두 번째는 메소드 매개 변수를 사용하여 모델 바인딩에 의존하는 수에 액세스 할 FormCollection를 사용할 수있는 형태의 데이터에 액세스하는 방법은 여러 가지가 있지만, 당신은해야합니다 있는지 확인 필드 이름은 매개 변수 이름과 일치하므로

<%: Html.TextBox("txtEmail", "", new { style = "width:100%" })%> 

... 필요 ...

,
[HttpPost] 
public ActionResult SendEmail(string txtEmail) 
{ 
    ... 
} 

이 양식이보기를 반환하는 것과 동일한 작업에 게시되지 않으면 시작 양식 태그를 변경해야합니다. '시작'양식에서도 '사용'을 사용해야합니다. 그래서 당신은 얻을 것이다 :

<% using (Html.BeginForm("SendEmail", "<controller-name>")) 
    { %> 
.... form fields in here ... 
<input type="submit" value="Send" /> 
<% } %> 

을 버튼은 같은 것을 사용할 수있는 디자인에 적합하지 않은 경우와 동일한 효과를 가질 것이다

<input type="image" src="<%: Url.Content("~/Content/images/myimage.gif") %>" value="Send" /> 

이 있습니다. 태그를 사용하여 게시물을 트리거하려면 javascript를 사용하여 살펴볼 필요가 있지만 정확한 구문을 기억할 수는 없지만 jquery를 사용하면 다음과 같은 내용을 볼 수 있습니다. 페이지 만)

<a href="#" click="$('form').submit(); return false;">Send</a> 

그러나 다음과 같은 정말 당신이 자바 스크립트를 사용할 수와 방문자가 사용할 수 있도록 귀하의 사이트가 정상적으로 저하가 시도해야 자바 스크립트에 대한 종속성을 만들 수 있습니다. 설계 요구 사항을 충족시키는 동안이 목표를 달성하는 더 진보 된 방법이있을 수 있지만, 이는 샘플을 위해 원하는 바깥에있는 클라이언트 측 코드에 크게 영향을받을 수 있습니다.

+1

폼 데이터에 액세스하는 방법에 대해 언급해야합니다. 폼 데이터에 강력하게 형식화 된 컨테이너 역할을하는 클래스를 만들 수 있습니다. 이러한 뷰 모델은 장기적으로 가장 좋은 방법입니다. 그리고 모델 바인딩은 mvc에서 매우 강력합니다. – Mark

+0

도움 마크를 주셔서 감사합니다. 많은 감사를드립니다. 당신의 설명은 정말 좋았고 이것이 어떻게 작동하는지 더 잘 이해할 수있었습니다. – Morrislgn

2

실제로 샘플보다 원하는 것을 얻기 쉽습니다. 모델 클래스, 모델 바인더 및 강력한 형식의 뷰에 대해 들어 본 적이 없습니까? 여기 thery는 모델 클래스

public class ContactUsModel 
{ 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public string Subject { get; set; } 
    public string Message { get; set; } 
} 

그런 다음 컨트롤러에서 두 조치를해야 있습니다 : 사용자가 위치 데이터와 형태를 받도록 기본 값으로 폼을 표시하는 제 1 및 제 2는. 이 두 작업은 HttpGet 및 HttPost 동사에 정확하게 매핑됩니다.

[HttpGet] 
public virtual ActionResult ContactUs() { 
    ContactUsModel model = new ContactUsModel(); 
    return View(model); 
} 


[HttpPost] 
public virtual ActionResult ContactUs(ContactUsModel model) { 
    //e.g. Save the contact request to database 
} 

이보기는 모든이의 마법이 ModelBinder를 호출되는 ContactUsModel 클래스

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ContactUsModel>" %> 

<% using (Html.BeginForm()) { %> 
    <div> 
     <%: Html.LabelFor(model => model.Name) %><br /> 
     <%: Html.TextBoxFor(model => model.Name, new { style = "width:100%" })%> 
    </div> 
    <div> 
     <%: Html.LabelFor(model => model.Email) %><br /> 
     <%: Html.TextBoxFor(model => model.EMail, new { style = "width:100%" })%> 
    </div> 
    <div> 
     <%: Html.LabelFor(model => model.Subject) %><br /> 
     <%: Html.TextBoxFor(model => model.Subject, new { style = "width:100%" })%> 
    </div> 
    <div> 
     <%: Html.LabelFor(model => model.Message) %><br /> 
     <%: Html.TextAreaFor(model => model.Message, new { style = "width:100%" })%> 
    </div> 
    <div> 
     <input type="submit" value="Save" /> 
    </div> 
<% } %> 

강한 입력 할 소재에 대한 증빙 자료로 사용합니다. MVC here에 대해 더 자세히 읽어보십시오.

+0

당신의 전체적인 설명에 감사 드리는 Lorenzo는 정말 좋았습니다. 나는 이것으로 시작하고있다. – Morrislgn