Model.IsValid 失败

Model.IsValid failing

我有以下型号:

public class Profile
{
    [Key]
    public int ProfileId { get; set; }
    public bool ProfileVisibility { get; set; }
    public string Description { get; set; }
    public bool? Gender { get; set; }
    public DateTime? Birthday { get; set; }

    public int? CityId { get; set; }
    public virtual City City { get; set; }

    public int? CountryId {get; set;}
    public virtual Country Country { get; set; }

    public string UserId { get; set; }
    public virtual ApplicationUser User { get; set; }

    public IEnumerable<SelectListItem> Countries { get; set; }
    public IEnumerable<SelectListItem> Cities { get; set; }
}

为了编辑个人资料,我创建了操作:

[Authorize(Roles = "Editor, Admin")]
public ActionResult Edit(string id)
{
    Profile pr = db.Profiles.Include("User").First(a => a.UserId == id);
    if (pr.UserId == User.Identity.GetUserId() || User.IsInRole("Admin"))
    {
        pr.Countries = GetAllCountries();
        pr.Cities = GetAllCities();
        return View(pr);
    }
    else
    {
        TempData["message"] = "Nu puteti modifica un profil care nu va apartine!";
        return RedirectToAction("Index");
    }
}

[HttpPut]
[Authorize(Roles = "Editor, Admin")]
public ActionResult Edit(string id, Profile requestProfile)
{
    requestProfile.Countries = GetAllCountries();
    requestProfile.Cities = GetAllCities();
    try
    {
        if (ModelState.IsValid)
        {
            Profile pr = db.Profiles.Find(id);
            if (TryUpdateModel(pr))
            {
                if (pr.UserId == User.Identity.GetUserId() || User.IsInRole("Admin"))
                {
                    pr = requestProfile;
                    pr.Country = db.Countries.Find(pr.CountryId);
                    pr.City = db.Cities.Find(pr.CityId);
                    pr.UserId = id;
                    pr.User = db.Users.Find(id);
                    pr.Birthday = DateTime.Now;
                    db.SaveChanges();
                    TempData["message"] = "Profilul a fost editat!";
                }
                else
                {
                    TempData["message"] = "Nu puteti modifica un profil care nu va apartine!";
                    return RedirectToAction("Index");
                }
            }
            return Redirect("/Profile/Show/");
        }
        else
        {
            return View(requestProfile);
        }
    }
    catch (Exception e)
    {
        return View(requestProfile);
    }
}

其中 Country 和 City 是另外 2 个模型,GetAllCountries 和 GetAllCities 是 return 和 IEnumerable<SelectListItem>.

中的 2 个非动作

我为编辑个人资料创建的视图是这样的:

@model TangoApp.Models.Profile
@{
    ViewBag.Title = "Edit";
}

<h2>Edit profile</h2>

<h2>Edit profile</h2>

@using (Html.BeginForm(actionName: "Edit", controllerName: "Profile"))
{
    @Html.HttpMethodOverride(HttpVerbs.Put)

    @Html.HiddenFor(m => m.ProfileId)

    <p>Profile vizibility:</p>
    <p>@Html.RadioButtonFor(Model => Model.ProfileVisibility, "true") public </p>
    <p>@Html.RadioButtonFor(Model => Model.ProfileVisibility, "false") private </p>

    @Html.HiddenFor(m => m.UserId)
    @Html.HiddenFor(m => m.User)
    @Html.HiddenFor(m => m.Cities)
    @Html.HiddenFor(m => m.Countries)
    @Html.HiddenFor(m => m.Birthday)
    @Html.Label("Text", "DDescription content")
    <br />
    @Html.EditorFor(m => m.Description)
    <br />
    @Html.ValidationMessageFor(m => m.Description)
    <br />

    <p>Gender:</p>
    <p>@Html.RadioButtonFor(Model => Model.Gender, "true") female </p>
    <p>@Html.RadioButtonFor(Model => Model.Gender, "false") male </p>

    <label>Selectati Tara</label>
    @Html.DropDownListFor(m => m.CountryId,
        new SelectList(Model.Countries, "Value", "Text"),
        "Select country", new { @class = "form-control" })
    @Html.ValidationMessageFor(m => m.CountryId, "", new { @class = "text-danger" })
    <br />

    <label>Selectati Orasul</label>
    @Html.DropDownListFor(m => m.CityId,
        new SelectList(Model.Cities, "Value", "Text"),
        "Select city", new { @class = "form-control" })
    @Html.ValidationMessageFor(m => m.CountryId, "", new { @class = "text-danger" })
    <br />

    <button class="btn btn-sm btn-succes" type="submit">Edit profile</button>
}

我认为问题在于它未通过 ModelState.IsValid,但我不明白为什么。有人可以帮助我吗?

如果附加调试器,则可以查看 ModelState.KeysModelState.Values,尤其是。 ModelState.Values[i].Errors。这些条目将显示模型绑定器将哪些模型项标记为无效以及原因。

拥有一个未提供的 intbool 模型项可能很简单,因为所有值类型(包括 intbool)都是根据定义要求,无论您是否使用属性指定。