【问题标题】:Model error in ASP.NET MVC 5ASP.NET MVC 5 中的模型错误
【发布时间】:2016-09-11 13:37:21
【问题描述】:

我目前正在尝试对表格的特定行进行更新。例如,在一页上,我检索了所有数据并将其显示在WebGrid 上。

WebGrid 中,我添加了一个名为Update 的带有button 的列。用户将单击Update 按钮并被重定向到另一个页面以更新详细信息。

但是,每次我点击Update时都会遇到这个错误。

传入字典的模型项是类型 'System.Collections.Generic.List`1[ACIFYPJ.Models.Response]',但这 字典需要“ACIFYPJ.Models.Response”类型的模型项。

这些是我的代码。

包含显示所有数据的 Webgrid 的页面

@model List<ACIFYPJ.Models.Response>

@{
    ViewBag.Title = "List Of Responses";
    Layout = "~/Views/Shared/_Layout.cshtml";
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: 5);
    grid.Pager(WebGridPagerModes.All);
}

<h2 style="margin-bottom: 3%; margin-top: 3%;">List Of Responses</h2>

<script src="~/Scripts/jquery-1.10.2.min.js"></script>

<script>
    $(document).ready(function () {
        $("#responseFeedBack").click(function () {

            var tr = $(this).parents('tr:first');
            var responseID = tr.find("#responseID").text();
            alert(responseID);
            var ResponseModel = {
                "responseID": responseID
            };

            $.ajax({

                url: '@Url.Action("ResponseFeedBack", "Course")',
                type: 'POST',
                data: {
                    "responseID": responseID
                },
                async: false,
                dataType: 'text',
                success: function (data) {

                }
            });
        });
    });

</script>

<div id="content">
    @grid.GetHtml(
    fillEmptyRows: false,
    tableStyle: "webgrid-table",
    headerStyle: "webgrid-header",
    footerStyle: "webgrid-footer",
    alternatingRowStyle: "webgrid-alternating-row",
    selectedRowStyle: "webgrid-selected-row",
    rowStyle: "webgrid-row-style",
    mode: WebGridPagerModes.All,
    firstText: "<< First",
    previousText: "<Prev",
    nextText: "Next >",
    lastText: "Last >>",

    columns: grid.Columns(
        grid.Column("responseID", "Response ID", format: @<text><span class="display-mode" id="responseID">@item.responseID</span></text>),

        grid.Column("name", "Sender's Name", format: @<text><span id="senderName" class="display-mode">@item.Name</span></text>),

        grid.Column("message", "Message", format: @<text><span class="display-mode"><label id="lblMessage">@item.message</label></span>
        </text>),

        grid.Column("status", "Message Status", format: @<text><span class="display-mode"><label id="lblStatus">@item.status</label></span>
        </text>),

        grid.Column("answer", "Answer", format: @<text><span class="display-mode"><label id="lblAnswer">@item.answer</label></span>
        </text>),

        grid.Column("", format: @<text>
            <button id="responseFeedBack">Reply</button>
        </text>, style: "col3Width", canSort: false)
))
</div>

<div style="margin-top: 2%;">
    @Html.ActionLink("Back to Home", "AdminIndex", "Home")
</div>

点击WebGrid上的Update按钮后,用户将被重定向到此页面

    @model ACIFYPJ.Models.Response

@{
    ViewBag.Title = "Send your Response";
}

<h2>Feedback Form</h2>

@using (Html.BeginForm("ResponseFeedBack", "Course", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4></h4>
        <hr />
        <div class="form-group">
            @Html.LabelFor(model => model.responseID, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.responseID, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.responseID, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.message, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextAreaFor(model => model.message, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.message, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.status, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.status, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.status, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.answer, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextAreaFor(model => model.answer, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.answer, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

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

我的控制器代码

public ActionResult ViewAllResponse()
        {
            var responses = new List<Response>();
            using (ACIFYPJEntities aci = new ACIFYPJEntities())
            {
                responses = aci.Responses.ToList();
            }
            return View(responses);
        }


        public ActionResult ResponseFeedBack(int responseID)
        {
            var responses = new List<Response>();

            using (ACIFYPJEntities aci = new ACIFYPJEntities())
            {
                responses = (from c in aci.Responses
                             where c.responseID == responseID
                             select c).ToList();
            }

            return View(responses);
        }

【问题讨论】:

  • 点击更新后究竟应该在页面上显示什么,因为返回 View(responses);你做的方法 return View(responses);这是一个响应类型列表,但在您看来,您有@model ACIFYPJ.Models.Response。您需要根据重定向视图的确切需要更改其中之一。
  • 在第一个视图 ViewAllResponse 中,它将显示一个 webgrid。在 webgrid 上,会有一个 Update 按钮。单击Update 按钮后,用户将被重定向到名为ResponseFeedBack 的视图。此视图将显示基于row 用户单击的信息。 @RaviA。
  • @RaviA。尝试了很久,似乎无法解决这个问题。请帮忙,谢谢!
  • Sukesh 的回答看起来不错。当您说它不会转到 ResponseFeedBack 时,请查看究竟发生了什么。它是否停留在与 webgrid 视图相同的视图上? .如果你在ResponseFeedBack 方法中设置断点,它会被命中吗?
  • 该消息是不言自明的。您的视图需要一个 typeof Response 的模型,但您将其传递给 List&lt;Response&gt;。您的视图甚至没有重定向的按钮/链接。您所拥有的是多个带有重复 id 属性(无效的 html)的“回复”按钮,它们进行 ajax 调用(ajax 调用从不重定向)到 ResponseFeedBack() 方法,该方法将 List&lt;Response&gt; 传递给大概是第二个视图一个上面有@model ACIFYPJ.Models.Response

标签: c# asp.net asp.net-mvc razor asp.net-ajax


【解决方案1】:

改变你的行动方法

public ActionResult ResponseFeedBack(int responseID)
    {
        var responses = Response();

        using (ACIFYPJEntities aci = new ACIFYPJEntities())
        {
            responses = (from c in aci.Responses
                         where c.responseID == responseID
                         select c).First();
        }

        return View(responses);
    }

【讨论】:

  • 我试过你的方法,但是当我点击Update时,它并没有进入ResponseFeedBack视图...
  • doesnt go 是什么意思? ResponseFeedBack 之前调用过,?如果是,那么它现在也应该被调用。放置断点并确认。重建解决方案并检查。
猜你喜欢
  • 2020-03-14
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 2010-10-18
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
相关资源
最近更新 更多