2010-08-21 26 views
0

我有这个视图模型:的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值,我会看到窗体细节,但出于某种原因,更新模型方法不起作用。 我查看了modelstate键,我发现它只有我传递的路由值(menuItemID)。但为什么? 它假设得到所有表单集合并更新它?

我尝试也传递ID在隐藏字段,这样的ModelState一切都是空的......

什么想法?

UPDATE:

我改变这一行:的UpdateModel(项目);

这样:

  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"]; 

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

+0

有人吗?我知道这是临时解决方案,只是为了使其工作,仍然想了解UpdateModel的用法 – danfromisrael 2010-09-20 15:26:06

回答

1

尝试UpdateModel(item, "Item")