MVC3 - Понимание POST с помощью кнопки - PullRequest
5 голосов
/ 08 октября 2011

Как получить данные формы после ее отправки?

<form target="_self" runat="server">
    <p>
    <select id="BLAHBLAH2">
        <option>2010</option>
        <option>2011</option>
        <option>2012</option>
        <option>2013</option>
    </select>
    <input type="submit" runat="server" value="Change Year" />
    </p>
</form>

Это соответствует методу Index контроллера.Но в Request.Form ничего нет.Почему?

Во-вторых, я могу использовать

<input type="button" вместо type=submit?То есть без введения ajax через onclick.

Наконец, как мне подчиниться другому методу в контроллере, например Create?

Ответы [ 3 ]

7 голосов
/ 08 октября 2011

Попробуйте удалить эти теги сервера runat.Они не должны использоваться в ASP.NET MVC.Также у вашего выбора нет имени.Если элемент ввода не имеет имени, он ничего не отправит.Кроме того, ваши теги параметров должны иметь атрибуты значения, которые указывают, какое значение будет отправлено на сервер, если выбраны эти параметры:

<form action="/Home/Create" method="post">
    <p>
    <select id="BLAHBLAH2" name="BLAHBLAH2">
        <option value="2010">2010</option>
        <option value="2011">2011</option>
        <option value="2012">2012</option>
        <option value="2013">2013</option>
    </select>
    <input type="submit" value="Change Year" />
    </p>
</form>

Но правильный способ создания форм в ASP.NET MVC - это использование помощников HTML.,В зависимости от используемого вами механизма представления синтаксис может отличаться.Вот пример с механизмом представления Razor:

@model MyViewModel
@using (Html.BeginForm("Create", "Home")) 
{
    <p>
        @Html.DropDownListFor(x => x.SelectedYear, Model.Years)
        <input type="submit" value="Change Year" />
    </p>
}

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

public class MyViewModel
{
    public string SelectedYear { get; set; }

    public IEnumerable<SelectListItem> Years
    {
        get
        {
            return Enumerable
                .Range(2010, 4)
                .Select(x => new SelectListItem
                {
                    Value = x.ToString(),
                    Text = x.ToString()
                });
        }
    }
}

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

public class HomeController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel();
        return View(model);
    }

    [HttpPost]
    public ActionResult Create(MyViewModel model)
    {
        ... model.SelectedYear will contain the selected year
    }
}
2 голосов
/ 08 октября 2011

Ни один из ваших <option> тегов не имеет значения:

...
<option value="2010">2010</option>
...

Как отметил Дэвид , runat = "server" - это определенно вещь WebForms, так что вы можете сделать это 86.

Если вы хотите использовать другой метод на вашем контроллере, вам просто нужно указать URL для этого метода.

Простой способ использования Html.BeginForm :

@using (Html.BeginForm("AnotherAction", "ControllerName")) {
   <!-- Your magic form here -->
}

Использование Url.Action

<form action="@Url.Action("AnotherAction")" method="POST">
   <!-- Your magic form here -->
</form>
0 голосов
/ 21 февраля 2014

Вы также можете использовать In Controller

int Value = Convert.ToInt32(Request["BLAHBLAH2"]); //To retrieve this int value

В файле .cshtml использовать

    <select id="IDxxx" name="BLAHBLAH2"> 

// Запрос [""] извлечет ЗНАЧЕНИЕ для html-объекта, чей "имя "вы запрашиваете.

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