ModelState不包含Form值

时间:2010-08-21 16:19:10

标签: data-binding asp.net-mvc-2 forms modelstate

我有这个视图模型:

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值,我确实看到了表单的详细信息,但由于某种原因,更新模型方法不起作用。 我查看了模型状态键,我发现它只获得了我传递的路由值(menuItemID)。但为什么? 它不是想要获取所有表单集合并更新它吗?

我还尝试在隐藏字段中传递id,以便模型状态全部为空......

任何想法?

更新

我改变了这一行: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"];

现在我知道这不是正确的方法,但同时它的工作原理...... 有没有人知道解决这个问题的方法所以它也是一个最好的做法? 谢谢!

1 个答案:

答案 0 :(得分:1)

尝试UpdateModel(item, "Item")