ASP.NET MVC2 - Как создать форму? - PullRequest
2 голосов
/ 24 января 2011

Как я могу создать форму в ASP.NET MVC2, отправить данные в контроллер, который что-то добавляет в базу данных, а затем перенаправляет на домашнюю страницу? Можете ли вы дать мне пример / фрагмент того, как это делается в представлении?


По какой-то причине в моей форме есть ошибка. Вот код:

AddEvent.aspx

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Add Event</h2>
<% using (Html.BeginForm()) { %>

    <div>
        <%= Html.LabelFor(x => x.EventName) %>: 
        <%= Html.TextBoxFor(x => x.EventName) %>
    </div>
    <div>
        <%= Html.LabelFor(x => x.EventDate) %>: 
        <%= Html.TextBoxFor(x => x.EventDate) %>
    </div>
    <div>
        <%= Html.LabelFor(x => x.EventLocation) %>: 
        <%= Html.TextBoxFor(x => x.EventLocation) %>
    </div>
    <div>
        <%= Html.LabelFor(x => x.EventDescription) %>: </br> 
        <%= Html.TextAreaFor(x => x.EventDescription) %>
    </div>

    <input type="submit" value="Submit" />
<% } %>

HomeController.cs

    public ActionResult AddEvent()
    {
        return View();
    }

    [HttpPost]
    public ActionResult AddEvent(Event e)
    {
        e.EventCreatorName = Session["UserName"].ToString();
        DatabaseModels db = new DatabaseModels();
        db.AddEvent(e);

        return RedirectToAction("Index", "Home");
    }

DatabaseModels.cs

    public bool AddEvent(Event e)
    {
        anEvent eventToAdd = new anEvent();
        eventToAdd.creator_nickname = e.EventCreatorName;
        eventToAdd.event_category = 1; // TODO
        if (e.EventDate == null)
        {
            eventToAdd.event_date = new DateTime();
        }
        else
        {
            eventToAdd.event_date = DateTime.Parse(e.EventDate);
        }
        eventToAdd.event_location = e.EventLocation;
        eventToAdd.event_name = e.EventName;

        m_db.AddToevents(eventToAdd);
        m_db.SaveChanges();
        return true;
    }

Я вписываю детали в форму и получаю следующее исключение:

Для этого свойства нельзя установить нулевое значение.

на event_location. Кто-нибудь может помочь решить эту проблему?

1 Ответ

4 голосов
/ 24 января 2011

Сайт asp.net / mvc содержит множество примеров, видео и учебных пособий о MVC, которые стоит прочитать. Вот пример того, как сценарий, о котором вы спрашиваете, может быть реализован:

Модель:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Контроллер:

public class PersonsController: Controller
{
    public ActionResult Index()
    {
        return View(new Person());
    }

    [HttpPost]
    public ActionResult Index(Person person)
    {
        // The person object here will have it's FirstName
        // and LastName properties bound to whatever values
        // the user entered in the corresponding textboxes in the form

        // TODO: save person to database 

        // redirect to /home/index
        return RedirectToAction("index", "home");
    }
}

Вид:

<%@ Page 
    Language="C#" 
    MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<AppName.Models.Person>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% using (Html.BeginForm()) { %>
        <div>
            <%= Html.LabelFor(x => x.FirstName) %>:
            <%= Html.TextBoxFor(x => x.FirstName) %>
        </div>

        <div>
            <%= Html.LabelFor(x => x.LastName) %>:
            <%= Html.TextBoxFor(x => x.LastName) %>
        </div>

        <input type="submit" value="Save" />
    <% } %>
</asp:Content>

Теперь вы можете быть удивлены частью TODO. Обычно я создаю хранилище для отделения логики доступа к данным от моего контроллера:

public interface IPersonsRepository
{
    void Save(Person person);
}

, а затем использовать конструктор для внедрения этого репозитория в мой контроллер:

public class PersonsController: Controller
{
    private readonly IPersonsRepository _repository;
    public PersonsController(IPersonsRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index()
    {
        return View(new Person());
    }

    [HttpPost]
    public ActionResult Index(Person person)
    {
        // The person object here will have it's FirstName
        // and LastName properties bound to whatever values
        // the user entered in the corresponding textboxes in the form

        // save person to database 
        _repository.Save(person);

        // redirect to /home/index
        return RedirectToAction("index", "home");
    }
}

Очевидно, теперь последняя оставшаяся часть - это реализация этого репозитория. Это будет зависеть от того, как и где хранятся ваши данные, и от конкретной технологии доступа к данным, которую вы будете использовать. Итак, вы используете реляционную базу данных, обычный текстовый файл, файл XML, объектную базу данных, некоторую базу данных, хранящуюся в облаке, ... как вы собираетесь получить к ней доступ: EF, NHibernate, Linq-to-XML, некоторый REST API ...

Как только вы сделаете свой выбор, вы просто реализуете интерфейс и проинструктируете свою инфраструктуру DI передать правильную реализацию конструктору контроллера.

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