2014-11-07 2 views
1

Я начинаю изучать Asp.net и C# около недели. До сих пор я развивался в PHP и Symfony, поэтому для меня это довольно большой переход. Я изучаю Asp.net из книги ASP.NET MVC 4 в действии.ASP.NET Новичок: Форма roundtrip с проверкой модели

Я пытаюсь проверить модель, но я не могу найти что-либо в Интернете, которое поможет новичку, как я. Модель проверяет форму контакта с именем, адресом электронной почты и сообщением. Простой, правда? Не для меня.

Это модель ...

public class ContactModel 
{ 
    [Required(ErrorMessage = "The name has to be provided, even a fictional one")] 
    public string Name { set; get; } 

    [Required(ErrorMessage = "Email address has to be provided, even a invalid one")] 
    [DataType(DataType.EmailAddress)] 
    public string Email { set; get; } 

    [Required(ErrorMessage = "Don't be lazy. Write a message")] 
    [DataType(DataType.MultilineText)] 
    public string Message { set; get; } 
} 

У меня есть контроллер с именем ContactController. Он имеет эти действия ...

public ActionResult Contact() 
{ 
    ContactModel contactModel = new ContactModel(); 
    return View(contactModel); 
} 

[HttpPost] 
public ViewResult SaveModel(ContactModel model) 
{ 
    return View(model); 
} 

Также здесь находится шаблон Razor, который показывает модель в пользовательском интерфейсе.

<div class="UI__Main Main__Contact"> 
<h1 class="UI__Main--SectionHeader">Contact the administrators of Life</h1> 

    @using (Html.BeginForm("SaveModel", "Contact", FormMethod.Post, new { @class="Form Form__Contact" })) 
    { 
     <div class="Form__Row"> 
      @Html.LabelFor(model => model.Name, new { @class="Form__Label" }) 
      @Html.TextBoxFor(model => model.Name, new { @class="Form__TextType Form__TextInput" }) 
      @Html.ValidationMessageFor(model => model.Name) 
     </div> 

     <div class="Form__Row"> 
      @Html.LabelFor(model => model.Email, new { @class = "Form__Label" }) 
      @Html.TextBoxFor(model => model.Email, new { @class = "Form__TextType Form__TextInput" }) 
     </div> 

      <div class="Form__Row"> 
       @Html.LabelFor(model => model.Message, new { @class="Form__Label" }) 
       @Html.TextArea("Message", new { @class = "Form__TextType Form__TextArea" }) 
      </div> 

     <div class="Form__Row Submit__Row"> 
      <input id="Submit__Button" type="submit" value="Send" /> 
     </div> 
    } 

Когда пользователь отправляет форму, форму придется пойти SaveModel действия в ContactController, но атрибут действия <form> пустой action="" поэтому я не думаю, что это даже будет Save Model. Кроме того, сообщения проверки не отображаются. Я попробовал @Html.ValidationMessageFor, но это отображает только текст, даже если я не отправлю форму.

Я даже не знаю, в чем проблема, не говоря уже об этом.

Если у кого есть предложения, учебные пособия, статьи или что-то в этом роде о создании формы в asp.net mvc 4 и бритве, пожалуйста, дайте мне это.

Я читал это article, но это не решает мою проблему. Я также нашел this Stack question и this Stack question, но, как я уже сказал, я новичок, и я действительно не понимаю проблем в этих вопросах.

EDIT:

Вот маршруты приложения ...

routes.MapRoute(
    name: null, 
    url: "", 
    defaults: new { controller = "Home", action="Index" } 
); 

routes.MapRoute(
    name: null, 
    url: "contact", 
    defaults: new { controller = "Contact", action = "Contact" } 
); 
+0

Вы внесли какие-либо дополнительные маршруты, помимо стандартного? – Tobias

+0

Я сделал редактирование. ContactController/ContactAction вызывается со статическим маршрутом, но, по моему мнению, проверка модели должна перейти к другому действию, которое является действием SaveModel в ContactController. –

ответ

1

вашего action остается пустой, потому что рамки MVC не могут разрешить URL для данного контроллера + действия. Вы должны явно определить URL в таблице маршрутизации:

routes.MapRoute(
    name: null, 
    url: "contact/send-form", 
    defaults: new { controller = "Contact", action = "SaveModel" } 
); 

Или же вы можете создать общий резервный маршрут

routes.MapRoute(
    name: null, 
    url: "{controller}/{action}", 
    defaults: new { controller = "Home", action = "Index" } 
); 

, которая приведет, что все контроллеры/действия доступны как прямые URLs ,

В качестве альтернативы; вы также можете использовать attribute routing, поэтому ваши маршруты определяются непосредственно по действиям, менее здесь здесь &.Для этого необходимо:

  • добавить routes.MapMvcAttributeRoutes(); в RegisterRoutes.cs
  • Append приписывает свои действия [Route("contact")]

Вы также можете повторно использовать один и тот же маршрут, если метод HTTP отличается:

[HttpGet] 
[Route("contact"} 
public ActionResult Contact() 
{ 
    ContactModel contactModel = new ContactModel(); 
    return View(contactModel); 
} 

[HttpPost] 
[Route("contact")] 
public ViewResult Contact(ContactModel model) 
{ 
    if(ModelState.IsValid){ 
    //persist your contact form, redirect somewhere 
    } 
    return View(model);//re-render the form with error messages 
} 
+0

ДА. Вот и все. Большое спасибо. Сообщение об ошибке отображается хорошо. –

+0

Использование атрибутов 'route' является существенным, если вы должны использовать его в случае, когда url должен иметь другую форму, чем на карте маршрута. В противном случае рекомендуется избегать этого параметра. Этот способ определяет строгий подход к вашему проекту. – W92

Смежные вопросы