【问题标题】:View returns null to a controller, accepting ViewModelView 返回 null 给控制器,接受 ViewModel
【发布时间】:2021-10-21 12:39:11
【问题描述】:

我的控制器有问题。它接受 null。

首先我有这样的 ViewModel

public class FilmVM
{
    public Film Film { get; set; }
    public IEnumerable<Image> Images { get; set; } = new List<Image>();
    public IEnumerable<SimilarFilm> SimilarFilms { get; set; } = new List<SimilarFilm>();
}

控制器看起来像

public ActionResult Edit(FilmVM film)
{
    _unitOfWork.Film.Update(film);

    return RedirectToAction("Index");
}

索引操作看起来像

public ActionResult Index(int? page)
{
    int pageSize = Constaints.Constaint.FilmsCount;
    int pageNumber = page ?? 1;
    var films = _unitOfWork.Film.GetDatas();

    return View(films.ToPagedList(pageNumber, pageSize));
}

VM 中的模型是默认值,例如 Guid、名称等。

查看模型的样子

@model GuessTheMovieApp.ViewModels.FilmVM

@{
    ViewBag.Title = "Edit";
}
<div class="wrapper">
    <h2>Edit</h2>
    @using (Html.BeginForm("Edit", "Films", FormMethod.Post, new { @class = "form-edit-film" }))
    {
        @Html.AntiForgeryToken()

        <div class="form-horizontal">
            <h4>Editing Film</h4>
            @Html.ValidationSummary(true, "", new { @class = "text-danger" })
            @Html.Partial("EditFilm", Model.Film)

            <div class="form-group">
                <div class="form-group__input">
                    <input type="submit" value="Save" class="btn btn-success" />
                </div>
            </div>
        </div>
    }
</div>

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

部分视图看起来像

@model GuessTheMovieApp.Models.DataBase.Film
    
<div class="form-horizontal">
    <h4>Film</h4>
    <hr />
    @Html.HiddenFor(model => model.FilmId)

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

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

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

我认为它们很常见。

我在 stackoverflow 上看到了类似的问题,但对我没有帮助。所以我在问是否有人知道这个问题的答案,请帮忙。

更新

通过将 Action Edit 更改为这种格式来弄清楚如何使用它

public ActionResult Edit(Film films, IEnumerable<Image> images, IEnumerable<SimilarFilm> similarFilms)
{
     _unitOfWork.Film.Update(new FilmVM { Film = films, Images = images, SimilarFilms = similarFilms });
     _unitOfWork.Save();

     return RedirectToAction("Index");
}

【问题讨论】:

  • 你有什么错误?
  • 你在_unitOfWork.Film.Update(film);之后打电话给_unitOfWork.Film.saveChanges吗?
  • 更多信息,请:您是否真的在保存数据(.SaveChanges());您能否向我们展示您的Index 操作方法(从Edit 操作重定向到的方法)?
  • 当然我会添加保存数据,但现在它没用,因为在控制器中我有 null Film 模型,在表单中保存数据后
  • 通过添加索引操作更新问题

标签: c# asp.net .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

我认为您不能阻止控制器在参数级别接受 null,最好的办法是在调用 _unitofWork 之前对传入的对象进行 null 检查

【讨论】:

    【解决方案2】:

    尝试对视图、局部视图和操作使用相同的模型。您可以使用 FilmVm 以及任何其他模型。例如,您可以在这种情况下使用 Film

    @model GuessTheMovieApp.ViewModels.Film
    
    .....
    
      <partial name="EditFilm" />
    
    ......
    
    

    和行动

    [HttpPost]  
    [ValidateAntiForgeryToken]  
    public ActionResult Edit(Film film)
    {
        var filmVm= new FilmVm { Film=film}
      .....
    }
    

    【讨论】:

    • 这可能是一个解决方案,但我需要那种类型的模型,并且将其更改为电影不会帮助我做这个应用程序。我想将图像和类似电影添加到其他视图中。
    • @YehorKarachetsev 使其工作的唯一方法是制作相同的模型。您也可以使用 FilmVm。如果您使用 Film,那么重做的工作就更少了。
    • 好吧,@Serge 你的回答促使我找到了解决问题的方法,我不知道我是否应该接受它作为答案,但我想出了如何解决这个问题。所以这里是 Edit Action ` public ActionResult Edit(Film movies, IEnumerable images, IEnumerablesimilarFilms) { _unitOfWork.Film.Update(new FilmVM { Film =films, Images = images, SimilarFilms =similarFilms }) 的代码; _unitOfWork.Save(); return RedirectToAction("索引"); } `
    猜你喜欢
    • 2020-06-18
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多