Передача параметров из текстовых полей в виде в контроллер в ASP.Net MVC2 - PullRequest
0 голосов
/ 26 ноября 2010

Я пробую ASP.Net MVC2, создав небольшой примерный веб-сайт, который, помимо прочего, предоставляет пользователю страницу «Свяжитесь с нами». Идея состоит в том, чтобы позволить пользователю ввести свое имя, адрес электронной почты, тему сообщения и сообщение. Чтобы отправить сообщение, пользователь нажимает на ссылку ActionLink. Это вид:

    <% 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();
    }

Однако ... когда я нажимаю на ссылку, значения, которые передаются в метод, равны нулю. Я попытался создать маршрут для этого, но он тоже не работает. Должен ли я использовать другой метод?

Спасибо,

1011 * Моррис *

Ответы [ 2 ]

2 голосов
/ 26 ноября 2010

На самом деле добиться того, чего вы хотите, проще, чем в вашем образце.Никогда не слышали о модельных классах, Model Binder и строгих типизированных представлениях?Вот они

Класс модели

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

Тогда в вашем контроллере вы должны выполнить два действия: первое, которое показывает форму со значениями по умолчанию, и второе, которое получает форму с помещенными данными.пользователем.Эти два действия точно соответствуют глаголам 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
}

Чтобы использовать это, ваш взгляд должен быть строго напечатан на ContactUsModel class

<%@ 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>
<% } %>

магии всегоназывается ModelBinder.Пожалуйста, прочитайте больше и больше о MVC здесь .

1 голос
/ 26 ноября 2010

Ссылка действия не будет вызывать публикацию http и не будет передавать значения полей вашей формы, только http get и не проходить через какие-либо данные формы - в идеале вы должны использовать кнопку ввода для отправки данные. Не вызывает сомнений то, что эффективная практика заключается в том, что любой запрос, который вызывает создание / обновление данных, должен выполняться через сообщение http.

Кнопка «Отправить» будет выглядеть так.

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

Затем у вас есть несколько способов доступа к данным формы. Во-первых, вы можете использовать FormCollection для доступа к данным

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

Во-вторых, вы можете использовать параметры метода и полагаться на привязку модели, но вы должны убедиться, что имена полей соответствуют имени параметра, поэтому

<%: 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>

Но затем вы создаете зависимость от javascript, где, как и на самом деле, вы должны стараться, чтобы ваш сайт изящно ухудшался, чтобы его могли использовать посетители с отключенным javascript. Возможно, существует более продвинутый способ достижения этого, при этом отвечая требованиям проектирования, но он может в значительной степени проникнуть в код на стороне клиента, который, вероятно, выходит за рамки того, что вы хотите для своего образца.

...