【问题标题】:MVC Tabs and Partial ViewsMVC 选项卡和局部视图
【发布时间】:2015-04-03 06:18:15
【问题描述】:

我对 MVC 很陌生,并且有这个需要使用选项卡和部分视图的庞大应用程序。我有一个 ViewModel,其字段是我的 EF 类的列表。我将此视图模型类(ProjInfoVM)传递到我的 ProjInfo 视图中。该视图有 3 个选项卡,它们是代表每个 EF 类的表单——它们都需要回发以供提交。 我的第一个挑战是让表单显示{我已经创建了 3 个强类型部分视图},但不知道如何显示它们,因为我不断收到错误: 传入字典的模型项的类型为“SMS2.Models.ProjectInfoVM”,但此字典需要类型为“SMS2.Models.ProjResc”的模型项 我的第二个挑战是如何将单个表单发布回控制器 - 我不知道如何实现这一点......我需要帮助

下面是我的代码:

ProjInfoVM.cs

public partial class ProjectInfoVM
    {
        public ProjCourse ProjCourse { get; set; }
        public ProjDocument ProjDocuments { get; set; }
        public ProjResc ProjRescs { get; set; }
    }

ProjResc 局部视图

@model SMS2.Models.ProjResc

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

        <fieldset>
            <legend>ProjResc</legend>

            <div class="editor-label">
                @Html.LabelFor(model => model.RescId)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.RescId)
                @Html.ValidationMessageFor(model => model.RescId)
            </div>
    .....
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    }

    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

....相同的格式适用于剩余的 2 个 Partial{_ProjDoc 和 _ProjCourses}

ProjResc.cs {同样适用于其他两个类}

 public partial class ProjResc
    {
        public int RescId { get; set; }
        public int ProjectId { get; set; }
        public Nullable<int> SponsorId { get; set; }
        public decimal StipendAmt { get; set; }
        public string StipendFreq { get; set; }
    }

现在我的 ProjInfo 控制器带有 Action ProjInfo,如下所示:

 public ActionResult ProjInfo()
        {

            ProjectInfoVM vm = new ProjectInfoVM();
           ...Populate vm contents here....           

            return PartialView(vm);
        }

和我的 ProjInfo 视图如下...

@model SMS2.Models.ProjectInfoVM

@{
    ViewBag.Title = "ProjInfo";
}
    <div class="panel panel-default tabs">
                            <ul class="nav nav-tabs" role="tablist">
                                <li class="active"><a href="#tab-first" role="tab" data-toggle="tab">Project Resources</a></li>
                                <li><a href="#tab-second" role="tab" data-toggle="tab">Project Restrictions</a></li>
                                <li><a href="#tab-third" role="tab" data-toggle="tab">Project Documents</a></li>
                                <li><a href="#tab-four" role="tab" data-toggle="tab">Project Courses</a></li>
                            </ul>
                            <div class="panel-body tab-content">
                                <div class="tab-pane active" id="tab-first">

                                    <h2>Partial View content  : @Model.ProjCourse.CourseName</h2>

                                   @Html.Partial("_ProjCourse", Model.ProjCourse)
                                                                </div>
                                <div class="tab-pane" id="tab-second">

                                    @Html.Partial("_ProjResc", Model.ProjResc)

                                </div>.......

我不断收到此错误..

The model item passed into the dictionary is of type 'SMS2.Models.ProjectInfoVM', but this dictionary requires a model item of type 'SMS2.Models.ProjResc'

有人可以解释一下我错过的地方吗...拜托

【问题讨论】:

  • 你能给我们看看你的 ProjInfo.cshtml 视图吗?特别是@model 语句。要从两个部分视图提交所有字段,您应该将它们包含在同一个表单块中
  • 我已对其进行了编辑以包含@model 语句

标签: asp.net-mvc-4 partial-views models


【解决方案1】:

在局部视图中,@model SMS2.Models.ProjResc 应更改为 @model ProjectInfoVM

对于第二部分检查 Html.BeginForm() 的重载,您可以指定控制器和将处理您的帖子的操作。 希望有帮助

【讨论】:

  • 谢谢....部分视图现在可以正确呈现....您能否详细说明如何将每个表单单独发布到控制器操作中
  • 谢谢..我解决了发布部分...通过在每个局部视图上使用单独的表单并将其重定向到不同的控制器操作..就像这样 @using (Html. BeginForm("ProjInfo", "Project", new { id = 1 })) {. 谢谢
  • 从 UI 角度来看,在标签中发布表单可能不是最好的,因为会重新加载整个页面。您可以调查如何调用相同的操作,但通过使用 jQuery 的 ajax 发布请求
  • @Lyubomir Velchev 你能解释一下我该怎么做吗...因为我有 4 个标签包含我的 ViewModel 类的一部分,我不希望每个标签都保存整个 Viewmodel 信息很难发布(我猜)..请详细说明。
  • 如果你在每个局部视图中都有整个视图模型是没有问题的。但是发布仍然会重新加载您的页面,并且可能会丢失您当前的标签。你可以看看那个例子:stackoverflow.com/questions/22540739/…
猜你喜欢
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多