【问题标题】:ASP.NET Core Add parameter to controller's Create methodASP.NET Core 将参数添加到控制器的 Create 方法
【发布时间】:2017-05-24 22:49:44
【问题描述】:

我的控制器的 Create 方法绑定到一个 TestCase 对象:

public async Task<IActionResult> Create([Bind("Name, Description")] TestCase testCase)

并且执行模型绑定的 View 需要一个 ViewModel,它是这样指定的:

 public class CreateTestCaseViewModel
    {
        public string ProjectName { get; set; }

        public TestCase TestCase { get; set; }
    }

我的视图代码(这只是一个输入名称和描述并提交的表单)是:

@model CreateTestCaseViewModel

@{
    ViewData["Title"] = "Create";
}

<h2>Create Test Case</h2>

<form asp-action="Create">
    <div class="form-horizontal">
        <hr />
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="TestCase.Name" class="col-md-2 control-label">
</label>
            <div class="col-md-10">
                <input asp-for="TestCase.Name" class="form-control" />
                <span asp-validation-for="TestCase.Name" class="text-danger"></span>
        </div>
    </div>

    <div asp-validation-summary="ModelOnly" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="TestCase.Description" class="col-md-2 control-label"></label>
        <div class="col-md-8">
            @*<input asp-for="Description" class="form-control" />*@
            <input asp-for="TestCase.Description" textarea class="form-control" id="Description" rows="5"/>

            <span asp-validation-for="TestCase.Description" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default"/>
        </div>
    </div>
</div>

<div>
        <a asp-action="Details">Back to List</a>
    </div>

    @section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

我的目标是让我的方法也能够将 ProjectName 作为参数:

public async Task<IActionResult> Create([Bind("Name, Description")] TestCase testCase, string projectName)

如何从视图中添加它?

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-core


    【解决方案1】:

    更改您的控制器操作以接受您的视图模型并将新参数添加到绑定列表(或完全删除将接受所有字段的绑定属性):

    public async Task<IActionResult> Create([Bind("Name, Description, ProjectName")] CreateTestCaseViewModel createTestCaseViewModel)
    

    然后将 ProjectName 的输入添加到视图中:

    <input asp-for="ProjectName" type="text" />
    

    【讨论】:

    • 我不想为项目名称添加新输入,它已经存在,我只是想在不使用 Session 的情况下存储它。我也试过了,无法绑定到视图模型的属性...我必须重命名它们吗?
    • 然后像其他答案建议的那样使用隐藏字段。到目前为止,这两个答案都是很好的解决方案。
    • 如果您遇到问题,请从您的创建操作中删除[Bind("")],直到您解决它。您也可以尝试使用 @Html.EditorFor(Model.TestCase.Name) 而不是 asp-for 标记助手来确保您定位到正确的属性名称。
    【解决方案2】:

    最简单的方法是在控制器中使用与视图相同的模型。

    public async Task<IActionResult> Create(CreateTestCaseViewModel model)
    

    然后在 View 中,如果您需要输入 ProjectName @Model.HiddenFor(Model.ProjectName),如果您只需要从模型中存储值,则可以创建 @Model.EditorFor(Model.ProjectName)更新你可以把它放在元素&lt;div class="form-horizontal"&gt;之后 实际上,无论在哪里,这个元素都会对用户隐藏。它应该在您的 &lt;form asp-action="Create"&gt; 元素中的唯一要求

    【讨论】:

    • 我不需要为此输入,这是我已经拥有的值,所以我应该使用 @Model.HiddenFor(Model.ProjectName) ,但是应该将它放在 html 结构的哪个位置?还有我将如何将表单中的数据绑定到该视图模型?
    • @JDoe 它将自动解析表单内的所有绑定。因此,如果您要添加隐藏输入,则其值将传递给控制器​​
    • 在我的视图中绑定视图模型后,我视图中的TestCase对象实际上是空的(项目名称是好的)。可能是什么问题?
    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2021-07-29
    • 2020-10-12
    相关资源
    最近更新 更多