Имена элементов формы ASP.NET MVC2 - PullRequest
0 голосов
/ 20 августа 2011

Я пытаюсь сделать действительно простую форму в ASP, используя MVC2 и C #. У меня есть два элемента и кнопка отправки, и я создал форму с помощью дизайнера в VS2010.

Просмотр:

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

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>

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

<form id="create_event" runat="server">
<h2>Create</h2>
<p>Event ID:
    <asp:TextBox ID="txtEventID" runat="server"></asp:TextBox>
</p>
<p>Event Description:
    <asp:TextBox ID="txtEventDescription" runat="server"></asp:TextBox>
</p>
<p>
    <asp:Button ID="submit" runat="server" Text="Add Event" />
</p>

</form>

</asp:Content>

Проблема, с которой я столкнулся сейчас, заключается в том, что, когда я пытаюсь получить доступ к элементам формы в моем контроллере, я получаю странные имена ключей, используя объект FormCollection.

Контроллер:

public ActionResult Create(FormCollection collection)
    {
        try
        {
            // TODO: Add insert logic here
            foreach (var key in collection)
            {
                var ks = key.ToString();
                var value = collection[key.ToString()];
            }

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Свойство name двух элементов управления используется для ключей, для которых во время выполнения устанавливается значение ctl00 $ MainContent $ txtEventDescription и ctl00 $ MainContent $ txtEventID. Можно ли как-то ссылаться на эти элементы по идентификаторам, которые я установил во время разработки? Я попытался добавить атрибут имени с тем же значением, что и идентификатор, но это не сработало.

Спасибо!

Ответы [ 3 ]

1 голос
/ 21 августа 2011

Попробуйте это:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<YourNamespace.YourModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Create
</asp:Content>

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

<% using (Html.BeginForm("AddEvent", "YourControllerName", FormMethod.Post, new { id = "create_event" }))
     { %>
    <h2>Create</h2>
    <p>Event ID: <%= Html.TextBox("txtEventID", Model.txtEventID)%> </p>
    <p>Event Description: <%= Html.TextBox("txtEventDescription", Model.txtEventDescription)%> </p>
    <button id="submit">Add Event</button>
  <% } %>
</asp:Content>

Вам нужно будет создать модель со свойствами 'txtEventID' и 'txtEventDescription' ... это модель, пространство имен которой вы добавите в атрибут Inherits в первой строке (между угловыми скобками).

Ошибка, которую вы совершаете, заключается в использовании классических элементов управления ASP. MVC имеет дело с чистым HTML и использует HTML-помощники для его генерации. HTML.Textbook() такой помощник.

... по сути, нет необходимости использовать помощники и модель ... вы можете использовать прямой HTML, например, так:

<p>Event ID: <input type="text" id="txtEventID" name="txtEventID" /> </p>
<p>Event Description: <input type="text" id="txtEventDescription" name="txtEventDescription" /> </p>

Мой совет: ознакомьтесь с руководствами здесь: http: //www.asp.net/mvc/tutorials.

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

public ActionResult Create(YourModel Model)
    {
        Model.txtEventID ...
    }

ASP.NET MVC использует «привязку модели» для привязки значений формы к вашей модели, чтобы вам не требовался доступ к FormCollection.

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

1 голос
/ 21 августа 2011

Удалите runat="server" из формы, которая совершенно не нужна в MVC.Вы также не должны использовать коллекцию форм и должны использовать привязку модели.И избавьтесь от <asp:*> элементов управления, они бесполезны в MVC.

Вместо этого используйте помощники HTML <%: Html.TextBoxFor(m => model.property) %>

Намного проще использовать прилагаемый помощник Html.BeginForm(),например:

<%: using (Html.BeginForm()) { %>
     .... your stuff
<%: } %>

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

0 голосов
/ 22 августа 2011

то, что сделал ваш дизайнер - это создать html-разметку, которая используется в веб-формах, а не в mvc.Вам нужно что-то вроде «cryotello», написанное

, но вам нужно будет создать представление сущности.

Что вас может заинтересовать, так это следующий проект, который имеет хорошее объяснение http://nerddinner.codeplex.com/

Также хорошей инвестицией была бы книга ASP.NET MVC 2 Стивена Сандерсона

, охватывающая множество основных вещей

удачи

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