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.Keys
和 ModelState.Values
,尤其是。 ModelState.Values[i].Errors
。这些条目将显示模型绑定器将哪些模型项标记为无效以及原因。
拥有一个未提供的 int
或 bool
模型项可能很简单,因为所有值类型(包括 int
和 bool
)都是根据定义要求,无论您是否使用属性指定。
我有以下型号:
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>
.
我为编辑个人资料创建的视图是这样的:
@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.Keys
和 ModelState.Values
,尤其是。 ModelState.Values[i].Errors
。这些条目将显示模型绑定器将哪些模型项标记为无效以及原因。
拥有一个未提供的 int
或 bool
模型项可能很简单,因为所有值类型(包括 int
和 bool
)都是根据定义要求,无论您是否使用属性指定。