簡體   English   中英

使用Ajax.BeginForm時設置Content-Type

[英]Set the Content-Type when using Ajax.BeginForm

我有一個簡單的ViewModel:

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; }
}

我有一個控制器,它發送到視圖和一個新的,未填充的viewmodel,並將CategoryId和ParentId設置為0。我的視圖使用@ Html.EditorFor使用viewmodel(自定義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值實際上僅包含“名稱”和“ ParentId”,而“ CategoryId”為0我的服務然后認為需要創建一個新的Category,返回一個新的CategoryViewModel,然后返回給客戶端的是JSON字符串。

我不明白為什么我的CategoryId沒有讀到我的ViewModel中。 另外,我也嘗試通過JSON字符串而不是URLEcoded提交數據。 我是否應該簡單地脫離助手,直接使用jquery?

非常感謝您的幫助

編輯晚上睡覺后:

無法將我的CategoryId讀取到ViewModel中的原因很簡單:CategoryId的注釋為[Editable(false)]如果刪除該注釋,則可以正常工作。 我實際上僅將這些批注用於EditorFor和驗證消息,而沒有意識到這會阻止對字段的實際寫入。

因此,我需要另一種方法來告訴EditorFor將某些字段呈現為隱藏的html字段。 有任何想法嗎? 以及為什么不能使用@ Ajax.BeginForm配置為將JSON字符串發送到服務器而不是url編碼,這仍然存在。 謝謝

因此,我需要另一種方法來告訴EditorFor將某些字段呈現為隱藏的html字段。 有任何想法嗎?

您可以使用HiddenInput屬性,該屬性將指示編輯器模板將其呈現為隱藏字段:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM