【问题标题】:Asp.net Core post form data when use multiple model使用多个模型时的 Asp.net Core 发布表单数据
【发布时间】:2019-06-10 14:36:11
【问题描述】:

编辑 当我想提交 form 模型值时,在 Asp.net core 2.2 中的 Action 中显示 null。我有一个 ComplexViewModel 包含 2 个 Model 像这样:

复杂视图模型

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>

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

【问题讨论】:

  • 模型绑定不支持元组。使用另一个类(视图模型)来封装元组中的内容,然后将其用作您的模型。
  • @ChrisPratt 首先我使用complex ViewModel。但也有同样的问题。例如,当我使用 @model.ComplexViewModel.Title 输入 id 变成 ComplexViewModel_Title
  • 这不是问题,这是设计使然。句点是基于 HTML 规范的 id 属性的无效字符。结果,它们被更改为该属性的下划线。但是,这个想法与发布的数据或模型绑定无关,所以没关系。 name 属性很重要。
  • @ChrisPratt All input name display ComplexViewModel.name and all input id display ComplexViewModel_id and the problem is null value in @987654339 @。我该如何解决?
  • 不要添加“@Model”。位到asp-for

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


【解决方案1】:

我可以通过手动添加 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】:

    在 MVC Core 3 中,模型中没有“asp-for”值的 Html 元素将显示为构建错误。

    但是,有一种方法可以使用 HTML 的“名称”属性将值回传到另一个操作。只需将“名称”值设置为要绑定的操作属性。在您的情况下,值与 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" />
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      相关资源
      最近更新 更多