【问题标题】:Get values in controller from two partial views in MVC从 MVC 中的两个局部视图获取控制器中的值
【发布时间】:2017-07-26 17:20:16
【问题描述】:

我有一个带有按钮的视图(razor,mvc4),里面有两个局部视图。它们是强类型的。每个部分都包含一个按钮和一些输入字段。

    <div>
        @{Html.RenderPartial("_LinkCreator", Model.linkCreator);}
    </div>
    <br />
    <div>
        @{Html.RenderPartial("_LinkFinder", Model.linkFinderImage);}
    </div>

主视图有一个模型

@model mvcPictureDownload.Models.PictureDownloadModel

在控制器内部我有一个动作结果

[HttpPost]
    public ActionResult LinkDownload(PictureDownloadModel pictureDownload,
LinkCreatorModel linkCreator, LinkFinderModel linkFinderImage)

如果我在其中一个局部视图中单击按钮,控制器会从该局部视图中捕获值,但我会从另一个局部视图的输入字段中获取空值。如果我在主视图上单击按钮,则只有第一个局部视图中的值会传递给控制器​​。

我需要在我的控制器中同时获得两个部分视图的值。有没有办法做到这一点?

编辑: 部分视图如下所示

@model mvcPictureDownload.Models.LinkFinderModel 
<script src="~/Scripts/jquery-1.7.1.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>LinkFinderModel</legend>
    <div class="container">
        <div class="row" >
            <div class="col-md-12">
                <div class="editor-label">
                    @Html.LabelFor(model => model.file)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.file, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.file)
                </div>
            </div>
        </div>
        <div class="row" >
            <div class="col-md-4">
                <div class="editor-label">
                    @Html.LabelFor(model => model.tagSearchExpression)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.tagSearchExpression, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.tagSearchExpression)
                </div>
            </div>
            <div class="col-md-4">
                <div class="editor-label">
                    @Html.LabelFor(model => model.attributeSearchExpression)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.attributeSearchExpression, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.attributeSearchExpression)
                </div>
            </div>
            <div class="col-md-4">
                <div class="editor-label">
                    @Html.LabelFor(model => model.folderSearchExpression)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.folderSearchExpression, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.folderSearchExpression)
                </div>
            </div>
        </div>
        <div class="row" >
            <div class="col-md-2">
                <div class="editor-label">
                    @Html.LabelFor(model => model.linkType)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.linkType, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.linkType)
                </div>
            </div>
            <div class="col-md-2">
                <div class="editor-label">
                    @Html.LabelFor(model => model.requiredText)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.requiredText, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.requiredText)
                </div>
            </div>
            <div class="col-md-2">
                <div class="editor-label">
                    @Html.LabelFor(model => model.avoidText)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.avoidText, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.avoidText)
                </div>
            </div>
            <div class="col-md-2">
                <div class="editor-label">
                    @Html.LabelFor(model => model.ReplaceThis)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.ReplaceThis, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.ReplaceThis)
                </div>
            </div>
            <div class="col-md-2">
                <div class="editor-label">
                    @Html.LabelFor(model => model.ReplaceWith)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => model.ReplaceWith, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => model.ReplaceWith)
                </div>
            </div>
        </div>
        <br />
    <p>
        <input type="submit" value="Apply" name="FinderButton" />
    </p>
    </div>
</fieldset>}

主视图是这个

@model mvcPictureDownload.Models.PictureDownloadModel@{
ViewBag.Title = "LinkDownload";}
<h4>LinkDownload</h4>

@using (Html.BeginForm())
{
@Html.ValidationSummary(true)

<fieldset>
    <legend>PictureDownloadModel</legend>

    <p>
        <input type="submit" value="Create" name="CreateButton" />
    </p>
</fieldset>

    <div>
        @{Html.RenderPartial("_LinkCreator", Model.linkCreator);}
    </div>
    <br />
    <div>
        @{Html.RenderPartial("_LinkFinder", Model.linkFinderImage);}
    </div>

<fieldset>
    <div class="container">
        <div class="row" >
            <div class="col-md-12">
                <div class="editor-label">
                    @Html.LabelFor(model => Model.FilePath)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(model => Model.FilePath, new { @class = "input-full" })
                    @Html.ValidationMessageFor(model => Model.FilePath)
                </div>
            </div>
        </div>
        <br /><br />
        <div class="row" >
            <div class="col-md-12">
                <div style="height:200px;overflow:auto;">
                    @foreach (var createRes in Model.linkCreatorResult)
                    {
                        <li><b>@createRes</b></li>
                    }
                </div>                    
            </div>
        </div>
    </div>   
    @Html.HiddenFor(model => Model.linkCreatorResult) 
</fieldset>}@section Scripts {
@Scripts.Render("~/bundles/jqueryval")}

【问题讨论】:

  • 你能显示你的观点的标记吗?
  • 我已经为视图添加了代码

标签: c# asp.net-mvc model


【解决方案1】:

正如我所见,每个部分视图都包含表单。因此,当您单击提交按钮时,浏览器会提交放置此按钮的表单。其他表单上的其他输入未提交。只需从部分中删除 FORM 标记并将其保留在主视图中即可。

在您的部分中,您不需要@Html.BeginForm()。顺便说一句,当您将 FORM 标记放在局部视图中时,请确保它不会被主视图中的另一个 FORM 包裹,否则您将获得无效的 HTML。

【讨论】:

  • 谢谢,从部分视图中删除 @Html.BeginForm() 标签解决了这个问题。我搜索了整整两天,我找到的最接近的例子是this,如果有人想要另一种方式来做我正在实施的事情。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多