2012-07-12 50 views
0

時設置的Content-Type我有一個簡單視圖模型:使用Ajax.BeginForm

public class CategoryViewModel 
{ 
    [Display(Name = "Category ID")] 
    [Editable(false)] 
    public int CategoryId { get; set; } 

    [Required(ErrorMessage = "Name is required")] 
    [StringLength(100, MinimumLength = 2, ErrorMessage = "You must enter a category name of at least 2 and maximum 100 characters")] 
    [Display(Name = "Name")] 
    public string Name { get; set; } 

    [HiddenInput(DisplayValue = false)] 
    public int? ParentId { get; set; } 
} 

我有一個控制器,其發送到視圖和新的,非填充,視圖模型與類別ID和PARENTID設置爲0 。我的觀點是使用@ Html.EditorFor使用視圖模型(自定義object.cshtml編輯模板),而是讓事情變得容易,我改變了它下面的簡單:

var options = new AjaxOptions() 
{ 
    Url = "/Api/Category/Post/" 
    OnComplete = "onCategorySaveComplete(xhr, status)", 
    OnBegin = "onCategorySaveBegin", 
    OnFailure = "onCategorySaveFailure(xhr, status)", 
}; 
@using (Ajax.BeginForm(options)) 
{ 
    <div class="inputForm"> 
     <div class="header">@(Model.CategoryId == 0 ? "New Category" : "Edit "+Model.Name+" ("+Model.CategoryId+"/"+Model.ParentId+")")</div> 
       <div class="section"> 
        <input type="hidden" name="CategoryId" value="" data-bind="value: CategoryId" /> 
        <input type="hidden" name="ParentId" value="" data-bind="value: ParentId" /> 
        <div class="line"> 
         <div class="label"> 
          @Html.LabelFor(m => m.Name) * 
         </div> 
         <div class="input"> 
          @Html.TextBoxFor(m => m.Name,null,new {@data_bind = "value: Name"}) 
          @Html.ValidationMessageFor(m => m.Name) 
         </div> 
        </div> 
       </div> 
     @Html.ValidationSummary("Some data is not correct:") 
     <div class="footer"> <input type="submit" id="btnSave" value="Save" /></div> 
    </div> 
} 

在我的API控制器,我有:

public CategoryViewModel Post(CategoryViewModel value) 
{ 
    value = CategoryService.AddOrUpdate(value); 
    return value; 
} 

我有其他的客戶端功能,這將允許用戶從KendoUI樹視圖中選擇一個類別,它通過API調用加載ViewModel,並使用KnockOut來綁定,但這一切都很好,所以讓我跳過這一點現在。

現在,當我提交表單,看看什麼是發送到服務器,我看到以下內容:

Key Value 
Request POST /Api/Category/Post/ HTTP/1.1 
Accept */* 
Content-Type application/x-www-form-urlencoded; charset=UTF-8 
X-Requested-With XMLHttpRequest 
Referer http://localhost:3709/Category/ 
Accept-Language en-GB,nl-BE;q=0.5 
Accept-Encoding gzip, deflate 
User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) 
Host localhost:3709 
Content-Length 71 
Connection Keep-Alive 
Cache-Control no-cache 
Cookie GUEST_LANGUAGE_ID=en_US; COOKIE_SUPPORT=true 

,並請求正文:

CategoryId=1130&ParentId=4&Name=Sensors&X-Requested-With=XMLHttpRequest 

截至目前,所有正常我猜。但我在我的API控制器添加了一個斷點,在這裏我看到我的CategoryViewModel值實際上只包含「Name」和「ParentId」,並且「CategoryId」爲0 然後我的服務認爲它需要創建一個新的Category ,返回一個新的CategoryViewModel,然後返回給客戶端的是JSON字符串。

我不明白爲什麼我的CategoryId沒有讀入我的ViewModel。另外,我試圖通過JSON字符串提交數據,而不是以URLEcoded方式提交數據。 我應該簡單地離開助手並直接使用jquery嗎?

非常感謝您的幫助

編輯後的夜間睡眠:

爲什麼我的類別ID沒有被讀入到我的視圖模型的原因是如此簡單:類別編號爲[編輯(假)] 註解如果我刪除它,工作。實際上,我僅將這些註釋用於EditorFor和驗證消息,卻沒有意識到它會阻止實際寫入該字段。

所以我需要另一種方式來告訴EditorFor將某些字段渲染爲隱藏的html字段。有任何想法嗎? 爲什麼使用@ Ajax.BeginForm無法配置發送JSON字符串到服務器而不是url編碼,這仍然是。 謝謝

回答

0

所以我需要另一種方式告訴EditorFor呈現爲隱藏的html字段的某些字段。有任何想法嗎?

您可以使用HiddenInput屬性,該屬性將指示編輯模板,以使其作爲一個隱藏字段:

[HiddenInput(DisplayValue = false)] 
public int CategoryId { get; set; }