使用多个模型时的ASP.NET Core核心表单数据

时间:2019-06-10 14:36:11

标签: jquery asp.net-mvc asp.net-core razor

修改 当我要提交form时,Asp.net core 2.2中Action中的模型值显示为空。我有一个ComplexViewModel包含2个Model,如下所示:

复杂的ViewModel

public class CreateQuestionComplexModel
{
    public questionViewModel questionViewModel { get; set; }
    public IEnumerable<Group> GroupModel { get; set; }
}

控制器

    [HttpGet]
    public IActionResult CreateQuestion(CreateQuestionComplexModel model)
    {
       return View(model);
    }

    [HttpPost]
    public IActionResult CreateQuestion(CreateQuestionComplexModel model)
    {
     //model is null here
     //ModelState

    }

这是我的观点

@model porseman.Models.ComplexModel.CreateQuestionComplexModel

@Html.PartialAsync("SideBarMenu", Model.GroupModel)

     <form class="row" asp-Controller="Question" asp-Action="CreateQuestion" method= "post">
          <div class="form-group">
             <div class="col-xs-10">
                 <input asp-for="questionViewModel.Title" type="text" class="form-control" />
             </div>
             <label asp-for="questionViewModel.Title" class="control-label col-xs-2"></label>
          </div>

          <input type="button" value="submit" class="btn" />
     </form>

现在,当我提交表单时,所有值都是null中的Action。我查看了所有输入 id 输入前缀questionViewModel_Title和所有输入 name questionViewModel.Title的代码后才发现。 现在如何将数据发布到Action ,或者如何删除前缀?

3 个答案:

答案 0 :(得分:0)

尝试像这样将模型更改为大写

public class CreateQuestionComplexModel
{
    public QuestionViewModel QuestionViewModel { get; set; }
    public IEnumerable<Group> GroupModel { get; set; }
}

您认为

asp-for="QuestionViewModel.Title"

最后在您的控制器中

[HttpPost]
public IActionResult CreateQuestion([FromBody] CreateQuestionComplexModel model)
{


}

答案 1 :(得分:0)

我可以手动添加id来解决问题。

尝试一下

@model porseman.Models.ComplexModel.CreateQuestionComplexModel

@Html.PartialAsync("SideBarMenu", Model.GroupModel)

 <form class="row" asp-Controller="Question" asp-Action="CreateQuestion" method= "post">
      <div class="form-group">

         <div class="col-xs-10">
             <input asp-for="questionViewModel.Title" id="Title" type="text" class="form-control" />
         </div>

      </div>

      <input type="button" value="submit" class="btn" />
 </form>

现在idTitle而不是questionViewModel_Title,在控制器中,您可以获得表格数据值。

答案 2 :(得分:0)

在MVC Core 3中,模型中未包含“ asp-for”值的HTML元素将显示为生成错误。

但是,有一种使用HTML“ name”属性将值回传到另一个操作的方法。只需将“名称”值设置为要绑定的action属性即可。您的情况下,值与asp-for属性中建议的值相同

这是一个示例,其中的动作未采用原始模型,而是一个列表和一个整数以调整某些图像文件的大小

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult EditImages(List<string> filenames, int percentage)

Razor视图包含一个输入,该输入具有整数值(在本例中为RANGE元素)和一个字符串数组,其中多个隐藏元素的name属性具有相同的值

<input type="range" min="1" max="99" value="50" class="w-100" id="inputSizePercent" name="percentage">

@for (int index = 0; index < Model.Images.Count; index++)
{
    <input type="hidden" name="filenames" value="@Model.Images[index].Filename" />
}