asp.net mvc 3 возвращает сообщение от действия контроллера ajax - PullRequest
1 голос
/ 20 декабря 2011

У меня есть вопрос об отправке формы Ajax.Вот код:

Контроллер

[HttpPost, ValidateAntiForgeryToken, ValidateInput(true)]
public ActionResult Contact(ContactForm model)
{
    if (!ModelState.IsValid)
    {                    
        return new EmptyResult();                    
    }
    else
    {
        string message = model.Name + " " + model.Telephone + " " + model.Email + " " + model.Address + " " + model.City + " " + model.ZipCode;

        //send it    

        return new EmptyResult();
     }
}

Просмотр

<script type="text/javascript">

    function PostSuccess() {
        $('.success-message').html("Thank you for your interested");
    }

    function PostFailure() {
        $('.success-message').html("Something went wrong... Make sure the required fields are filled out and in correct format");
    }
</script>
<div class="contact-form">
@using (@Ajax.BeginForm("Contact", "Info", new AjaxOptions { HttpMethod = "Post", OnFailure = "PostFailure", OnSuccess = "PostSuccess" }))
{ 
    <p>
    @Html.LabelFor(x => x.Name, "Your name") 
    @Html.TextBoxFor(x => x.Name, new { @class = "required" })<span class="required">*</span>
    </p>

    <p>
    @Html.LabelFor(x => x.Email, "Your email")
    @Html.TextBoxFor(x => x.Email)<span class="required">*</span>
    </p>

    <p>
    @Html.LabelFor(x => x.Telephone, "Your phone")
    @Html.TextBoxFor(x => x.Telephone)<span class="required">*</span>
    </p>

    <p>
    @Html.LabelFor(x => x.Address, "Your address")
    @Html.TextBoxFor(x => x.Address)
    </p>

    <p>
    @Html.LabelFor(x => x.ZipCode, "Your zipcode")
    @Html.TextBoxFor(x => x.ZipCode)
    </p>

    <p>
    @Html.LabelFor(x => x.City, "Your city")
    @Html.TextBoxFor(x => x.City)
    </p>
    @Html.AntiForgeryToken()
    <button type="submit" id="bContact">Send Message</button>
}

<div class="required">* Required Fields</div>
<div class="success-message">Output</div>

Все, что я хочу, это соответствующее сообщениев классе «сообщение об успехе», но POST всегда успешен, поэтому я всегда получаю «Спасибо за ваш интерес».

Спасибо.

Ответы [ 3 ]

2 голосов
/ 20 декабря 2011

Если я вас правильно понимаю, вы бы хотели, чтобы ваша форма была проверена. То есть вы бы хотели, чтобы сообщение в PostFailure отображалось, если пользователь сделал несколько неверных вводов, и вынуждали его вносить исправления перед выполнением кода в инструкции else вашего контроллера. Вы не опубликовали свою модель, поэтому я не знаю, делаете ли вы это, но для проверки формы вы должны использовать Аннотации данных .

Например, ваша модель должна содержать:

[Required(ErrorMessage = "Name is required!")]
public string Name { get; set; }

для поля имени. Вы можете изменить сообщение так, как вам хочется, что позволяет использовать сообщение, специфичное для Name, а не общее, которое у вас есть, если хотите.

Тогда в представлении вы должны включить:

@Html.ValidationMessageFor(x => x.Name)

И обязательно укажите:

<appSettings>
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>

в вашем файле web.config для включения проверки на стороне клиента (при условии, что вы включили библиотеки проверки jQuery, но они включены по умолчанию в проекты ASP.NET MVC3).

2 голосов
/ 20 декабря 2011

Чтобы получить соответствующее сообщение в классе «success-message», вы должны изменить код в вашем действии. Такие как:

[HttpPost, ValidateAntiForgeryToken, ValidateInput(true)]
        public ActionResult Contact(ContactForm model)
        {
            if (!ModelState.IsValid)
            {

                return Json("", JsonRequestBehavior.AllowGet);

            }
            else
            {
                string message = model.Name + " " + model.Telephone + " " + model.Email + " " + model.Address + " " + model.City + " " + model.ZipCode;
                return Json(message, JsonRequestBehavior.AllowGet);
            }
        }

и в функции успеха вы помещаете туда параметр.

function PostSuccess(data) {

        $('.success-message').html(data);
    }
0 голосов
/ 20 декабря 2011

OnSuccess и OnFailure указывает, был ли вызов AJAX выполнен успешно или не выполнен.Из MSDN для OnFailure :

This function is called if the response status is not in the 200 range.

Чтобы запустить OnFailure, вы можете сделать следующее:

throw new HttpException(404, "Not Found");

Но я бы порекомендовал, чтобы было лучшеизмените событие success, чтобы оно вызывало функцию javascript, которая бы анализировала результаты вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...