【问题标题】:Id of a model is not passed from the view to the action correctly in ASP MVC when Editing a list of models编辑模型列表时,模型的 ID 未从视图正确传递到 ASP MVC 中的操作
【发布时间】:2017-07-15 02:25:31
【问题描述】:

我将对象列表传递给视图并允许用户更新单个对象的属性。

这是获取操作。我在这里将文章列表传递给视图。

public ActionResult EditArticleList(int id)
    {
        ArticleList articleList = unitOfWork.ArticleListRepository.GetById(id);
        IEnumerable<Article> Articles = articleList.Articles;

        return View(Articles);
    }

这是视图。

@model IEnumerable<Domain.Entities.Article>

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>EditArticleList</title>
</head>
<body>

@for (int i = 0; i < Model.Count(); i++)
{
    using (Html.BeginForm("EditArticleList", "AdminArticleList", FormMethod.Post))
    {
        @Html.AntiForgeryToken()
        @Html.EditorFor(model => Model.ToList()[i].Title, null, "Title")
        @Html.HiddenFor(model => Model.ToList()[i].Id)

    <input type="submit" />
    <br />
    }
}    

这是发布操作。

public ActionResult EditArticleList(Article art)
    {
    }

我正在传递 3 篇 ID 为 1、2、3 的文章。 但是无论我更新和发布哪个文章,id都返回为1。 标题返回正确。

【问题讨论】:

  • 这真的没有意义。您一次只能提交一个表单,那么为什么要创建多个表单。以及您生成的与您的模型无关的 name 属性。
  • @StephenMuecke 我允许用户从项目列表中一次更新一个项目。每个项目都有一个更新按钮。这就是我为每个项目创建一个表单的原因。
  • 这是错误的方法,并且是一个糟糕的 UI(如果用户在 2 个文本框中输入值并点击提交按钮,认为两者都会被保存。你将无法返回视图如果ModelState 无效
  • 要么有一个带有“编辑”链接的只读“索引”视图,要么有一个带有for 循环的表单,以便用户可以在一个操作中编辑它们

标签: asp.net asp.net-mvc asp.net-mvc-4 razor


【解决方案1】:

这很有效,而且比仅使用 mvc 的解决方案要好,后者需要每个按钮都有一个 id。如果您想让我研究一个查询字符串纯 mvc 解决方案,请告诉我吗?:

查看:

@model IEnumerable<Testy20161006.Controllers.Article>
@using Testy20161006.Controllers
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>EditArticleList</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script type="text/javascript">
        function SubmitTheForm(theId) {
            $("#theId").val(theId);
            $("#formName").submit();
        }
    </script>
</head>
<body>
    @Html.AntiForgeryToken()
    @*USE YOUR own controller below*@
    @using (Html.BeginForm("EditArticleList", "Home", FormMethod.Post, new { id = "formName" }))
    {
        <input type="hidden" id="theId" name="theId" />
        <table>
            @foreach (Article item in Model)
            {
                <tr>
                    <td></td>
                    <td>
                        @Html.EditorFor(model => item.Title, null, "Title")
                    </td>
                    <td>
                        <input type="button" onclick="SubmitTheForm('@item.Id')" value="Select" />
                    </td>
                </tr>
            }
        </table>
        <br />
    }
</body>
</html>

控制器/视图模型:

//your code might be slightly different, but if you look at the view you can solve your issue
public class Article
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public class ArticleList
{
    public IList<Article> Articles { get; set; }
}

namespace unitOfWork
{
    public static class ArticleListRepository
    {
        public static ArticleList GetById(int id)
        {
            var article1 = new Article { Id = 1, Title = "article1" };
            var article2 = new Article { Id = 2, Title = "article2" };
            var article3 = new Article { Id = 3, Title = "article3" };
            ArticleList articleList = new ArticleList();
            articleList.Articles = new List<Article>();
            articleList.Articles.Add(article1);
            articleList.Articles.Add(article2);
            articleList.Articles.Add(article3);
            return articleList;
        }
    }
}

public class HomeController : Controller
{
    [HttpPost]
    public ActionResult EditArticleList(int theId, Article art)
    {
        //put breakpoint here to see the id returned.
        return View(art);
    }

    public ActionResult EditArticleList(int? id)
    {
        ArticleList articleList = unitOfWork.ArticleListRepository.GetById(5);  //hard coding for demo
        IEnumerable<Article> Articles = articleList.Articles;

        return View(Articles);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2015-06-04
    • 2015-05-06
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    相关资源
    最近更新 更多