ModelState 不包含 Form 值
我有这个视图模型:
public class ItemMenuViewModel
{
public ItemMenu Item { get; set; }
public IEnumerable<SelectListItem> Pages { get; set; }
}
对于这个视图:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SIIMVC.Controllers.ItemMenuViewModel>" %>
<%@ Import Namespace="SIIMVC.Models.Extensions" %>
<% using (Ajax.BeginForm("SaveMenuItem",, new { menuItemID = Model.Item.ItemMenuID },
new AjaxOptions { UpdateTargetId = "submitMsg", HttpMethod = "POST", OnSuccess = "MsgUserAndReloadPage" }))
{ %>
<%: Html.ValidationSummary(true)%>
<% Html.EnableClientValidation(); %>
<fieldset class="allRight">
<legend>עריכת פריט בתפריט</legend>
מספר פריט:
<%: Model.Item.ItemMenuID%>
<br />
<div class="editor-label">
שם פריט:
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Item.Text)%>
<%: Html.ValidationMessageFor(model => model.Item.Text,"yoooooooo")%>
</div>
<div class="editor-label">
קישור לדף:
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Item.PageURL,Model.Pages,"ללא קישור")%>
<%: Html.ValidationMessageFor(model => model.Item.PageURL)%>
</div>
<%-- <%: Html.DropDownList("PageURL",Html.GetPagesSelectList(Model),"ללא קישור"); %>--%>
<div class="editor-label">
מיקום הפריט בתפריט.<br />
נא לציין מספר פריט-הורה:<br />
(לקטגוריה ראשית להשאיר ריק)
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Item.ParentID)%>
<%: Html.ValidationMessageFor(model => model.Item.ParentID)%>
</div>
<div class="editor-label">
סידור הפריט (ביחס לפריטים אחרים):
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Item.OrderNumber)%>
<%: Html.ValidationMessageFor(model => model.Item.OrderNumber)%>
</div><br />
<%if (HttpContext.Current.User.IsInRole("Site Admin"))
{ %>
שייך עמוד לקטגוריה <br />
<%= Html.DropDownListFor(model => model.Item.CategoryID, new SelectList(Html.GetCategories(), "CategoryID", "CategoryName", Model.Item.CategoryID))%>
<%} %><br /><br />
<p>
<input type="submit" value="שמור שינויים" id="saveItem" /> <input type="button" value="מחק פריט" id="deleteItem" />
</p>
<% } %>
<p id="submitMsg">
</p>
</fieldset>
这是获取表单的操作:(
//
// POST: /Admin/SaveMenuItem/34
[HttpPost]
public ActionResult SaveMenuItem(int? menuItemID,FormCollection values)
{
if (!ModelState.IsValid)
return Content("טעות בהכנסת נתונים");
MenuModel menu = new MenuModel();
var item = menu.GetItemByID(menuItemID ?? -1);
UpdateModel(item);
//item.PageURL = db.GetPageByID(item.+".html";
bool success = db.SaveItemMenuToDB(item, false);
if (success)
{
menu.ReloadCache();
return Content("הפריט נשמר בהצלחה");
}
else
return Content(db.UserMessage);
}
抱歉希伯来语消息:-D)
问题: 如果我查看 formCollection 值,我确实会看到表单详细信息,但由于某种原因,更新模型方法不起作用。 我查看了 modelstate 键,发现它只获得了我传递的路由值(menuItemID)。但为什么? 它不是应该获取所有表单集合并更新它吗?
我还尝试在隐藏字段中传递 id,以便 modelstate 全部为空...
有什么想法吗?
更新:
我更改了这一行:UpdateModel(item);
对此:
item.CategoryID =Convert.ToInt32( Request.Form["Item.CategoryID"] );
item.OrderNumber = Convert.ToInt32(Request.Form["Item.OrderNumber"]);
item.ParentID = Convert.ToInt32(values["Item.ParentID"]);
item.Text = Request.Form["Item.Text"];
item.PageURL = Request.Form["Item.PageURL"];
现在我知道这不是正确的方法,但同时它有效...... 有谁知道解决这个问题的方法,因此这也是最佳实践? 谢谢!
i have this view model:
public class ItemMenuViewModel
{
public ItemMenu Item { get; set; }
public IEnumerable<SelectListItem> Pages { get; set; }
}
for this view:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SIIMVC.Controllers.ItemMenuViewModel>" %>
<%@ Import Namespace="SIIMVC.Models.Extensions" %>
<% using (Ajax.BeginForm("SaveMenuItem",, new { menuItemID = Model.Item.ItemMenuID },
new AjaxOptions { UpdateTargetId = "submitMsg", HttpMethod = "POST", OnSuccess = "MsgUserAndReloadPage" }))
{ %>
<%: Html.ValidationSummary(true)%>
<% Html.EnableClientValidation(); %>
<fieldset class="allRight">
<legend>עריכת פריט בתפריט</legend>
מספר פריט:
<%: Model.Item.ItemMenuID%>
<br />
<div class="editor-label">
שם פריט:
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Item.Text)%>
<%: Html.ValidationMessageFor(model => model.Item.Text,"yoooooooo")%>
</div>
<div class="editor-label">
קישור לדף:
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Item.PageURL,Model.Pages,"ללא קישור")%>
<%: Html.ValidationMessageFor(model => model.Item.PageURL)%>
</div>
<%-- <%: Html.DropDownList("PageURL",Html.GetPagesSelectList(Model),"ללא קישור"); %>--%>
<div class="editor-label">
מיקום הפריט בתפריט.<br />
נא לציין מספר פריט-הורה:<br />
(לקטגוריה ראשית להשאיר ריק)
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Item.ParentID)%>
<%: Html.ValidationMessageFor(model => model.Item.ParentID)%>
</div>
<div class="editor-label">
סידור הפריט (ביחס לפריטים אחרים):
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Item.OrderNumber)%>
<%: Html.ValidationMessageFor(model => model.Item.OrderNumber)%>
</div><br />
<%if (HttpContext.Current.User.IsInRole("Site Admin"))
{ %>
שייך עמוד לקטגוריה <br />
<%= Html.DropDownListFor(model => model.Item.CategoryID, new SelectList(Html.GetCategories(), "CategoryID", "CategoryName", Model.Item.CategoryID))%>
<%} %><br /><br />
<p>
<input type="submit" value="שמור שינויים" id="saveItem" /> <input type="button" value="מחק פריט" id="deleteItem" />
</p>
<% } %>
<p id="submitMsg">
</p>
</fieldset>
and this is the action that gets the form:
//
// POST: /Admin/SaveMenuItem/34
[HttpPost]
public ActionResult SaveMenuItem(int? menuItemID,FormCollection values)
{
if (!ModelState.IsValid)
return Content("טעות בהכנסת נתונים");
MenuModel menu = new MenuModel();
var item = menu.GetItemByID(menuItemID ?? -1);
UpdateModel(item);
//item.PageURL = db.GetPageByID(item.+".html";
bool success = db.SaveItemMenuToDB(item, false);
if (success)
{
menu.ReloadCache();
return Content("הפריט נשמר בהצלחה");
}
else
return Content(db.UserMessage);
}
( Sorry for the hebrew messages :-D )
the problem:
if I look in the formCollection values i do see the form details, but for some reason the update model method doesnt work.
i've looked in the modelstate keys and i see that it got only the route value i passed (menuItemID). but why?
doesnt it suppose to get all the form collection and update it?
i tried also passing the id in an hidden field so that modelstate was all empty...
Any Ideas ?
UPDATE:
I changed this line: UpdateModel(item);
to this:
item.CategoryID =Convert.ToInt32( Request.Form["Item.CategoryID"] );
item.OrderNumber = Convert.ToInt32(Request.Form["Item.OrderNumber"]);
item.ParentID = Convert.ToInt32(values["Item.ParentID"]);
item.Text = Request.Form["Item.Text"];
item.PageURL = Request.Form["Item.PageURL"];
Now i know this is not the way to do it right, but meanwhile it works...
does anyone know a way to solve this so it will also be a best practice ?
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
尝试
UpdateModel(item, "Item")
Try
UpdateModel(item, "Item")