在单击按钮时调用控制器方法时,需要将文本框值作为参数传递

时间:2019-04-24 13:03:59

标签: c# asp.net-mvc asp.net-mvc-4 razor

我正在使用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 个答案:

答案 0 :(得分:1)

因为您为输入标签和文本区域设置了名称,并且与参数相同,因此您可以添加Object来形成表单,并将操作链接更改为action="/Home/Create"标签或{ {1}}这样的标签

<button>

如果有两个Create方法,则需要标记HttpPost属性

<input type="submit" />

答案 1 :(得分:0)

您的表单的类型为Post,那么您的控制器操作方法应为[HttpPost],您的“ hello”和“ world”是有效的,因为您在查询参数中发送了该表单,并且将其视为{{ 1}}

因此,首先,如果您需要提交表单,则您的按钮应为[HttpGET]的输入类型 而不是SUBMIT使用输入类型Submit

actionlink

如果您曾经使用过<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.net核心标记助手。

您的表单操作被视为asp-action,只需将控制器用作Home/Create

,如果您在Home taghelpers中标记时使用MVC 4,则不支持。 对于MVC-4,您应该使用

MVC-4

然后,您的代码出现的问题是将操作设置为表单,并在操作方法上设置@using(Html.BeginForm("create", "home", FormMethod.Post)) { } 属性。

您的操作应如下所示

[HttpPost]

和您的HTML [HttpPost] public ActionResult Create(string title, string description) { //---- } 名称必须与您要绑定的模型属性相同。或者您可以使用textbox

类似示例

让我知道是否需要更多信息。

@Html.TextBoxFor()

现在<div class="col-md-4"> <input id="textinput" name="RequestTitle" type="text" class="form-control input-md" required="" /> </div> 已与您的模型属性id="textinput"绑定