Необходимо передать значения текстового поля в качестве параметров при вызове метода контроллера при нажатии кнопки - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над формой MVC, которая должна позволять пользователю вводить некоторые описания своей проблемы в различных полях, а затем текст в этих полях будет скомпилирован в электронное письмо и отправлено нам после того, как пользователь нажмет на "Отправить "кнопку.

У меня достаточно проводов для передачи жестко закодированных строк в качестве параметров, когда пользователь нажимает кнопку.

@model IntakeFormV2.Models.BotRequest
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<style type="text/css">
    #textarea {
        height: 500px;
    }
</style>
<form class="form-horizontal" method="post" asp-controller="HomeController" asp-action="Create">

    @Html.AntiForgeryToken()

    <fieldset>

        <!-- Form Name -->
        <legend>New Request</legend>

        <!-- Text input-->
        <div class="form-group">
            <label class="col-md-4 control-label" for="textinput">Summarize your issue in 100 characters</label>
            <div class="col-md-4">
                <input id="textinput" name="title" type="text" class="form-control input-md" required="" />
            </div>
        </div>

        <!-- Textarea -->
        <div class="form-group">
            <label class="col-md-4 control-label" for="textarea">Let us know about any additional information here</label>
            <div class="col-md-4">
                <textarea class="form-control" id="textarea1" name="description"></textarea>
            </div>
        </div>

        <!-- Button -->
        <div class="form-group">
            <label class="col-md-4 control-label" for="singlebutton"></label>
            <div class="col-md-4">
                <p>@Html.ActionLink("Submit Request", "Create", "Home", routeValues: new { title = "hello", description = "world" }, htmlAttributes: new { @class = "btn btn-primary"})</p>
            </div>
        </div>
    </fieldset>
</form>

Но вместо того, чтобы передавать «Hello» и «World», мне нужно передать все вводимые пользователем данные в поля «textinput» и «textarea1».

Я довольно новичок в MVC, но я знаю, что модель должна быть где-то здесь.Но я не смог найти, как установить значения модели из вида, когда на самом деле есть текст на входе.

namespace RPAIntakeFormV2.Models
{
    public class BotRequest
    {
        public string RequestTitle { get; set; }
        public string RequestDescription { get; set; }
        public string RequesterName { get; set; }
        public string RequesterDepartment { get; set; }
        private bool RequestAdded = false;
    }
}

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

public class HomeController : Controller
{
    private IEnumerable<IssuePriority> priorities;
    private IEnumerable<IssueStatus> statusses;

    public HomeController()
    {
        index i = 1;
    }

    public ViewResult Index()
    {
        return View("Index");
    }

    public ActionResult Create(string title, string description)
    {
        try
        {
            MessageBox.Show("Hello world");

            return RedirectToAction("Index");
        }
        catch (Exception ex)
        {
            return View("Index2");
        }
    }
}

Может кто-нибудь сказать мне, что мне не хватает?

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Поскольку вы задаете имя для входного тега и textarea , то же самое с вашим параметром в действии, так что вы можете добавить action="/Home/Create", чтобы сформировать и изменить ссылку действия на <button> тег или <input type="submit" /> тег, подобный этому

<form class="form-horizontal" method="post" action="/Home/Create">

    @Html.AntiForgeryToken()

    <fieldset>

        <!-- Form Name -->
        <legend>New Request</legend>

        <!-- Text input-->
        <div class="form-group">
            <label class="col-md-4 control-label" for="textinput">Summarize your issue in 100 characters</label>
            <div class="col-md-4">
                <input id="textinput" name="title" type="text" class="form-control input-md" required="" />
            </div>
        </div>

        <!-- Textarea -->
        <div class="form-group">
            <label class="col-md-4 control-label" for="textarea">Let us know about any additional information here</label>
            <div class="col-md-4">
                <textarea class="form-control" id="textarea1" name="description"></textarea>
            </div>
        </div>

        <!-- Button -->
        <div class="form-group">
            <label class="col-md-4 control-label" for="singlebutton"></label>
            <div class="col-md-4">
                <button>Submit Request</button>
            </div>
        </div>
    </fieldset>
    </form>

Если у вас есть два метода Create, вам нужно пометить атрибут HttpPost

[HttpPost]
public ActionResult Create(string title, string description)
0 голосов
/ 24 апреля 2019

Ваша форма имеет тип Post, тогда ваш метод действия контроллера должен быть [HttpPost] ваши "привет" и "мир" работает, потому что вы отправляете это в параметре запроса, и оно рассматривается как [HttpGET]

поэтому сначала, если вам требуется отправить форму, тогда ваша кнопка должна иметь тип ввода SUBMIT, а не actionlink использовать тип ввода submit

<input type="submit" value="Submit Request" class="btn btn-primary" />

, если вы используете asp.net core, а затем

<form class="form-horizontal" method="post" asp-controller="HomeController" asp-action="Create">

ЗДЕСЬ asp-controller и asp-action - это основные теги asp.net.

ваше действие с формой рассматривается как Home/Create, просто используйте контроллер как Home

и если вы используете MVC 4 в качестве тега в MVC-4 taghelpers, не поддерживается.для MVC-4 вы должны использовать как

@using(Html.BeginForm("create", "home", FormMethod.Post))
{

}

, тогда проблема с вашим кодом задает ваше действие в форме и устанавливает атрибут [HttpPost] в вашем методе действия.

и ваше действие должно бытькак показано ниже

[HttpPost]
public ActionResult Create(string title, string description)
{
     //----
}

, и ваше имя HTML textbox должно совпадать с именем вашей модели, которое вы хотите связать.или вы можете использовать @Html.TextBoxFor()

как пример

, дайте мне знать, если вам нужна дополнительная информация.

<div class="col-md-4">
     <input id="textinput" name="RequestTitle" type="text" class="form-control input-md" required="" />
</div>

сейчас id="textinput" привязано к свойству модели RequestTitle

...