【问题标题】:ASP.net Core MVC 2.0 Passing FormEditModel from view to controllerASP.net Core MVC 2.0 将 FormEditModel 从视图传递到控制器
【发布时间】:2017-12-09 12:20:20
【问题描述】:

您好,我正在为一个学校项目使用 Microsoft asp.net MVC Core 2.0 做一个简单的博客,并且在为 Articles 实施 CRUD 操作时遇到了问题。更准确地说,我只有编辑文章方法有问题。 这是我的控制器方法

[HttpPost]
[ValidateModelState]
     public async Task<IActionResult> EditArticle(ArticleEditServiceModel parameter)
        {
            parameter.Title = this.html.Sanitize(parameter.Title);
            parameter.Content = this.html.Sanitize(parameter.Content);

            //var user = this.userManager.GetUserName(User.Identity.Name)

            await this.articles.EditAsync(parameter.Id, parameter.Title, parameter.Content);

            return RedirectToAction(nameof(Index));
        } 

这是我的服务“EditAsync”方法:

public async Task<bool> EditAsync(int id, string title, string content)
        {
            var article = await this.db.Articles.Where(a => a.Id == id).FirstOrDefaultAsync();

            if (article == null)
            {
                return false;
            }

            article.Title = title;
            article.Content = content;

            await this.db.SaveChangesAsync();
            return true;
        }

观点:

@model ArticleEditServiceModel

@{
    ViewData["Title"] = "Edit Article";
}

<h2>@ViewData["Title"]</h2>


<div class="row">
    <div class="col-md-4">
        <form asp-controller="Article" asp-action="EditArticle"  asp-route-parameter=@Model method="post"> 
            <div class="form-group">
                <label asp-for="Title"></label>
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="form-text text-danger"></span>
            </div>

            <div class="form-group">
                <label asp-for="Content"></label>
                <input asp-for="Content"  required class="form-control" />
                <span asp-validation-for="Content" class="form-text text-danger"></span>
            </div>
            <a asp-controller="Article" asp-action="Index" class="btn btn-default">Back</a>
            <button type="submit" formmethod="post" class="btn btn-success">Edit Article</button>
        </form>
    </div>
</div>

@section Scripts {
    @await Html.PartialAsync("_ValidationScriptsPartial")
}

它通过 Id 找到正确的文章,并为我提供了两个输入字段,我可以在其中编辑文本,但是当我单击提交按钮时,文章没有应用任何更改。我尝试调试并发现视图将空模型发送到控制器 post 方法。我似乎找不到代码有什么问题,所以我想我应该向更有经验的开发人员征求意见。

【问题讨论】:

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


    【解决方案1】:

    我尝试调试并发现视图将空模型发送到 控制器 post 方法。

    我相信视图发送了正确的请求,但是在服务器端的模型绑定过程中发生了错误。

    要解决此问题,您应该在控制器操作中为ArticleEditServiceModel 参数添加[FromBody] 属性:

    public async Task<IActionResult> EditArticle([FromBody] ArticleEditServiceModel parameter)
    

    FromBody 属性指示 ASP.NET Core 框架应使用基于 Content-Type http 标头的媒体类型格式化程序从请求正文中反序列化操作参数。详情请查看this article,它解释了 ASP.NET MVC 和 ASP.NET Core MVC 在模型绑定上的区别。

    【讨论】:

      【解决方案2】:

      您应该从表单中取出 asp-route-id=@Model.Id 因为您将模型直接发送到 EditArticle。创建一个输入 type="hidden" asp-for="Id" class="form-control" 就可以了。

      【讨论】:

        猜你喜欢
        • 2014-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多