【问题标题】:Trying to post two models with a single view试图用一个视图发布两个模型
【发布时间】:2020-08-05 23:13:13
【问题描述】:

我有下一个视图,它有一个包含两个对象的视图模型。

    @model prueba.ViewModel.InfoSolicitanteViewModel

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

<h1>CreateSolicitante1</h1>

<h4>Solicitante</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="InfoPersonal.Ocupacion" class="control-label"></label>
                <input asp-for="InfoPersonal.Ocupacion" class="form-control" />
                <span asp-validation-for="InfoPersonal.Ocupacion" class="text-danger"></span>
            </div>

            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>

        <div class="col-md-4">
            <form asp-action="Create">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="Solicitante.NombreSolicitante" class="control-label"></label>
                    <input asp-for="Solicitante.NombreSolicitante" class="form-control" />
                    <span asp-validation-for="Solicitante.NombreSolicitante" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="Solicitante.Numero" class="control-label"></label>
                    <input asp-for="Solicitante.Numero" class="form-control" />
                    <span asp-validation-for="Solicitante.Numero" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <input type="submit" value="Create" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>

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

控制器是相同的自动生成的,唯一的例外是我告诉信息创建获取控制器使用什么视图,以便两个控制器使用相同的视图。框架版本为 .NET core 2.2

现在我正在尝试发布带有提交按钮的模型,但它只发送到我从相应索引访问的控制器。另外,如果有一种方法可以将两个模型都发送到两个控制器,只需提交一次,我也很想知道。 提前致谢!

【问题讨论】:

    标签: c# model-view-controller razor asp.net-core-mvc


    【解决方案1】:

    现在我正在尝试发布带有提交按钮的模型,但是 它只发送到我从相应索引访问的控制器。

    添加asp-controller 以指定要将数据发布到哪个控制器。

    <div class="row">
    <div class="col-md-4">
        <form asp-controller="InfoPersonals" asp-action="Create">
            //...
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
    
    <div class="col-md-4">
        <form asp-controller="Solicitantes" asp-action="Create">
            //...
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
    

    如果有办法将两个模型发送到两个控制器 一个提交,我也很想知道。

    我想你可以使用jquery change函数来判断哪个输入填充了值,然后将相应的动作附加到表单中:

    @model InfoSolicitanteViewModel
    
    @{
        ViewData["Title"] = "CreateSolicitante";
    }
    
    <h1>CreateSolicitante1</h1>
    
    <h4>Solicitante</h4>
    <hr />
    <div class="row">
        <form method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="InfoPersonal.Ocupacion" class="control-label"></label>
                <input asp-for="InfoPersonal.Ocupacion" class="form-control" />
                <span asp-validation-for="InfoPersonal.Ocupacion" class="text-danger"></span>
            </div>
    
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Solicitante.NombreSolicitante" class="control-label"></label>
                <input asp-for="Solicitante.NombreSolicitante" class="form-control" />
                <span asp-validation-for="Solicitante.NombreSolicitante" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Solicitante.Numero" class="control-label"></label>
                <input asp-for="Solicitante.Numero" class="form-control" />
                <span asp-validation-for="Solicitante.Numero" class="text-danger"></span>
            </div>
    
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>   
    </div>
    
    <div>
        <a asp-action="Index">Back to List</a>
    </div>
    
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    <script>
        $(document).ready(function () {
            $("input[name^='Solicitante']").change(function () {
                $('form').removeAttr('action');
                $('form').attr('action', '/Solicitantes/Create');
            });
            $("input[name^='InfoPersonal']").change(function () {
                $('form').removeAttr('action');
                $('form').attr('action', '/InfoPersonals/Create');
            });
        })
    </script>
    }
    

    我的测试模型:

    public class InfoSolicitanteViewModel
    {
        public InfoPersonal InfoPersonal { get; set; }
        public Solicitante Solicitante { get; set; }
    }
    public class InfoPersonal
    {
        public int Id { get; set; }
        public string Ocupacion { get; set; }
    }
    public class Solicitante
    {
        public int Id { get; set; }
        public string NombreSolicitante { get; set; }
        public string Numero { get; set; }
    }
    

    结果:

    在输入框内写一些东西,然后在输入框外按回车键或点击。它会触发更改事件。

    【讨论】:

    • 我还是有同样的问题。即使在我指定了我想要的控制器之后,它也会使用我从中访问的控制器(我现在在共享文件夹中有创建视图,我认为这会改变任何事情)。假设我的字段和按钮在主视图中。如果我可以在不改变路线的情况下使用两者中的任何一个(或同时使用两者,如果可能的话),我会很高兴。
    • 您是如何访问创建视图的?您能分享更多代码吗?实际上,如果您为两个表单指定asp-controller,它可以生成正确的url,请确保控制器名称正确.我建议你可以分享你拥有的更新代码。分享你的简单控制器会更好。
    • 你说你喜欢在不改变路线的情况下使用两者中的任何一个。如果你不改变路线,按钮如何知道它应该击中哪个控制器?你试过我的第二个吗方式?我帖子中的第二种方式是通过jquery更改url,它仍然不起作用吗?
    【解决方案2】:

    现在我正在尝试发布带有提交按钮的模型,但它只发送到我从相应索引访问的控制器。另外,如果有一种方法可以将两个模型都发送到两个控制器,只需要一次提交,我也很想知道。

    您可以使用jQuery.ajax() 一键发布这两种表格。首先,您需要给每个表单一个唯一的 ID。然后只留下 1 个提交按钮,并给它一个唯一的 id。

    然后注册一个点击事件来监听那个按钮的点击。如果该按钮在表单内,那么防止表单的默认行为也很重要,这样当您单击该按钮时它就不会提交表单。

    这是一个如何使用 jQuery 通过 ajax 发送请求的示例。我给出了solicitantesForm 和infoPersonalsForm 的表单ID。对于此示例,该按钮的 ID 为 submitButton:

            $(document).ready(function () {
                $('#submitButton').click(function (e) {
                    e.preventDefault();
                    var solicitantesFormData = new FormData(document.getElementById('solicitantesForm'));
                    $.ajax({
                        contentType: false,
                        type: 'POST',
                        cache: false,
                        processData: false,
                        method: 'POST',
                        url: '/Solicitantes/Create',
                        data: solicitantesFormData,
                        success: function (response) {
                            alert('solicitantesForm submitted');
                        },
                        error: function (response) {
                            alert('error submitting solicitantesForm');
                        }
                    });
                    var infoPersonalsFormData = new FormData(document.getElementById('infoPersonalsForm'));
                    $.ajax({
                        contentType: false,
                        type: 'POST',
                        cache: false,
                        processData: false,
                        method: 'POST',
                        url: '/InfoPersonals/Create',
                        data: infoPersonalsFormData,
                        success: function (response) {
                            alert('infoPersonalsForm submitted');
                        },
                        error: function (response) {
                            alert('error submitting infoPersonalsForm');
                        }
                    });
                });
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-24
      • 2012-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 2017-01-15
      相关资源
      最近更新 更多