ModelState 不包含 Form 值

发布于 2024-09-15 01:09:33 字数 4944 浏览 6 评论 0原文

我有这个视图模型:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

·深蓝 2024-09-22 01:09:33

尝试 UpdateModel(item, "Item")

Try UpdateModel(item, "Item")

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文