【问题标题】:How do i pass two text inputs into ActionResult method如何将两个文本输入传递给 ActionResult 方法
【发布时间】:2019-11-01 12:32:54
【问题描述】:

我这几天一直在做一个大型项目。除了这部分,它都完成了。我正在尝试将 2 个文本框传递到我的家庭控制器方法中。

我尝试使用“模型”。和“项目”。但没有运气。它总是通过 null

<p>
    @Html.ActionLink("Display", "Home", FormMethod.Post)
</p>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div>
        Month:<input type="text" name="Month" id="MonthInput">
        Extra:<input type="text" name="Extra" id="ExtraInput"><br /><br />
        <input type="submit" value="Add" class="btn btn-default"> <br> <br>
    </div>
}

在家庭控制器中是

[HttpPost]
public ActionResult Display(String Month, String Extra)
{
        if (ModelState.IsValid)
        {
             ...
             return RedirectToAction("Index");
        }
        return view;
}

我希望它传递单击“添加”按钮时在文本框中输入的任何值,但它给出了 null

【问题讨论】:

  • @using(Html.BeginForm ... 将呈现一个表单标签,但是你有第二个
    所以你在表单中有一个表单,是假设 MVC 约定,不带参数的 @using(Html.BeginForm 将表单操作属性呈现为呈现页面的控制器,但在您的第二个表单中,您有一个 PHP 操作 url。同样,这是您的意图吗?最后,MVC 表单通常会绑定到传递给视图的模型。在您的视图顶部是否有这样的东西:@model MyApp.Models.Student
  • 我有@model IEnumerable。文本框部分使用模型 AmorView 发布在带有预设列表模板的视图中。
  • Post 方法只接受一个来自 body 的参数。因此,最好传递模型,然后在控制器操作方法中传递该模型。

标签: c# asp.net asp.net-mvc visual-studio asp.net-mvc-4


【解决方案1】:

为了正确映射到动作的参数,您必须使用name 属性。

@using (Html.BeginForm("Display", "Home"))
{
    @Html.AntiForgeryToken()
    <div>
            Month:<input type="text" name="Month" id="MonthInput">
            Extra:<input type="text" name="Extra" id="ExtraInput"><br /><br />
            <input type="submit" value="Add" class="btn btn-default">
    </div>
}

完全不相关,但您似乎有 2 个嵌套表单,其中一个 POST 到 php 页面。这是需要的吗?

另外,删除以下代码,因为它没有任何意义:

<p>
    @Html.ActionLink("Display", "Home", FormMethod.Post)
</p>

【讨论】:

  • 我可以把它们拿出来。只是将其更改为 name 而不是 id 仍然返回 null
  • 我已经编辑了我的代码。查看最后一个版本(您同时拥有名称和 ID)。
  • 刚刚编辑了代码并发布在上面。仍然只返回 Null
  • 你能从你的html中删除&lt;form action="/action_page.php"&gt;吗?
  • 只有当我用 div 类或类似的东西替换它时
【解决方案2】:

要补充上一个答案,我建议在控制器中接受表单作为 FormCollection,因为表单似乎与模型无关:

    [HttpPost]
    public ActionResult Display(FormCollection collection)
    {
        if (ModelState.IsValid)
        {
            string month = collection["Month"];
            string extra = collection["Extra"];

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

【讨论】:

  • 或者甚至创建一个具有两个变量的简单类,以便框架进行映射
  • 感谢您的帮助,但 @satsvelke 已修复
【解决方案3】:

试试这个,

在视图中

@using (Html.BeginForm("Display", "Home", FormMethod.Post))
 {
    @Html.AntiForgeryToken()

    <div>
    Month:<input type="text" name="Month" id="MonthInput">
    Extra:<input type="text" name="Extra" id="ExtraInput"><br /><br />
    <input type="submit" value="Add" class="btn btn-default"> <br> <br>
    </div>
}

在控制器中,

[HttpPost]
public ActionResult Display(SomeClass someClass)
{
    if (ModelState.IsValid)
    {
         ...
         return RedirectToAction("Index");
    }
    return view;
}

创建普通类名SomeClass,根据您的要求命名,

public class SomeClass{
 public string Month {get;set;}
 public string Extra {get;set;}
}

input 的 name 属性要匹配 SomeClass 的属性,它会自动映射,然后你可以使用 someClass 对象来访问值

  someClass.Month and someClass.Extra  

【讨论】:

  • 非常感谢。这完全修复了它。我在网上找不到任何东西来修复它。你太棒了!
【解决方案4】:
namespace Your.Models
{
    public class DisplayModel
    {
        public string Month {get;set;}
        public string Extra {get;set;}
    }
}

[HttpPost]
    public ActionResult Display(DisplayModel model)
    {
        if (ModelState.IsValid)
        {
            string month = model.Month;
            string extra = model.Extra;

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

@using Your.Models
@model DisplayModel

@using (Html.BeginForm("Display", "Home", new { id="displayview" }))
{
    @Html.AntiForgeryToken()
    <div>
            Month:<input type="text" name="Month" id="MonthInput">
            Extra:<input type="text" name="Extra" id="ExtraInput"><br /><br />
            <input type="submit" value="Add" class="btn btn-default">
    </div>
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多